SQL 拆分、加入和合并 [重复]

问题描述 投票:0回答:3

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 函数,因为它需要数据库兼容性。

sql sql-server merge split concatenation
3个回答
0
投票

你可以试试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

0
投票

这是另一个仅使用

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

这里演示


0
投票

对于那些仍然认为 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 将它连接回去

© www.soinside.com 2019 - 2024. All rights reserved.