我不确定这在 SQL 的其他实现中得到了多大的支持,但如果你有 SQL Server,这对于这种类型的场景来说很有魅力。
作为免责声明,我想补充一点,我不是这项技术的创始人。但是当我遇到这个问题时,我立即想到了这个问题。
例子:
对于一张桌子
Item ID Item Value Item Text
----------- ----------------- ---------------
1 2 A
1 2 B
1 6 C
2 2 D
2 4 A
3 7 B
3 1 D
如果您想要以下输出,将字符串连接起来并求和。
Item ID Item Value Item Text
----------- ----------------- ---------------
1 10 A, B, C
2 6 D, A
3 8 B, D
以下避免了多语句循环解决方案:
if object_id('Items') is not null
drop table Items
go
create table Items
( ItemId int identity(1,1),
ItemNo int not null,
ItemValue int not null,
ItemDesc nvarchar(500) )
insert Items
( ItemNo,
ItemValue,
ItemDesc )
values ( 1, 2, 'A'),
( 1, 2, 'B'),
( 1, 6, 'C'),
( 2, 2, 'D'),
( 2, 4, 'A'),
( 3, 7, 'B'),
( 3, 1, 'D')
select it1.ItemNo,
sum(it1.ItemValue) as ItemValues,
stuff((select ', ' + it2.ItemDesc --// Stuff is just used to remove the first 2 characters, instead of a substring.
from Items it2 with (nolock)
where it1.ItemNo = it2.ItemNo
for xml path(''), type).value('.','varchar(max)'), 1, 2, '') as ItemDescs --// Does the actual concatenation..
from Items it1 with (nolock)
group by it1.ItemNo
因此,您看到您所需要的只是您的选择中的一个子查询,该查询检索一组您需要连接的所有值,然后以一种巧妙的方式在该子查询中使用 FOR XML PATH 命令。您需要连接的值来自哪里并不重要,您只需要使用子查询检索它们即可。