TableDO
| DOID | TranID |
| -------- | ------ |
| 1 | 1 2 3 |
| 2 | 2 4 |
TblTransporter
| TranID |Transporter |
| -------- | -------- |
| 1 | ABC Tran |
| 2 | BBC Tran |
| 3 | CBC Tran |
| 4 | DBC Tran |
结果需要来自 TableDO
| DOID | Transporter |
| -------- | -------- |
| 1 | ABC Tran,BBC Tran,CBC Tran|
| 2 | BBC Tran,DBC Tran |
我试过了
Select o.DoNo,t.Transporter as tpt
From DO o
outer apply String_Split(o.Transporter,' ') s
left join Transporter as t on t.TID = s.value
显示结果
| DONO | Tpt |
| -------- | -------- |
| 1 | ABC Tran |
| 1 | BBC Tran |
| 1 | CBC Tran |
| 2 | BBC Tran |
| 2 | DBC Tran |
我不想使用 String_Split 函数,因为它需要数据库兼容性。
你可以试试STRING_AGG()
Select o.DoNo,STRING_AGG(t.Transporter,',') as tpt
From DO o
outer apply String_Split(o.Transporter,' ') s
left join Transporter as t on t.TID = s.value
GROUP BY o.DoNo
这是另一个仅使用
GROUP BY
和 STRING_AGG
的解决方案:
select DOID, STRING_AGG(t.Transporter,',') as tpt
from TableDO d
inner join TblTransporter t on cast(d.TranID as varchar) like concat('%',t.TranID, '%')
group by DOID
结果:
DOID tpt
1 ABC Tran,BBC Tran,CBC Tran
2 BBC Tran,DBC Tran
对于那些仍然认为 SQL Server 2016 是最新最好版本的人来说,这是一个解决方案:
DECLARE @do TABLE (doid int, tranid varchar(100))
DECLARE @tblTransporter TABLE (tranID int, transporter varchar(100))
INSERT INTO @do
SELECT doid, tranid
FROM (
VALUES (1,'1 2 3')
, (2,'2 4')
) t (DOID,TranID)
INSERT INTO @tbltransporter
SELECT tranid,Transporter
FROM (
VALUES (1,'ABC Tran')
, (2,'BBC Tran')
, (3,'CBC Tran')
, (4,'DBC Tran')
) t (TranID,Transporter)
SELECT doid
, STUFF((SELECT ISNULL(',' + t.transporter, '')
FROM (
SELECT cast('<root><i>' + replace(tranid, ' ', '</i><i>') + '</i></root>' AS xml) x
) x
CROSS apply x.nodes('root/i') n(n)
LEFT JOIN @tblTransporter t
ON t.tranID = n.value('.', 'INT')
ORDER BY n.value('.', 'INT')
FOR XML PATH(''), TYPE
).value('.', 'nvarchar(max)'), 1, 1, '')
FROM @do
它看起来有点忙,但它所做的是从 tranIds 列表创建一个 xml,然后使用节点拆分它,然后使用另一个 FOR XML PATH 将它连接回去