请参阅下面的表TABLE
:
ID FIELD_1
-------------
1 123
1 456
1 789
2 111
我想按ID列出所有FIELD_1
,如下所示:
select [ID],
stuff((
select '; ' + [FIELD_1]
from [TABLE] t1
where t1.[ID] = t2.[ID]
for xml path ('')
),1,1, '') as [FIELDS]
from [TABLE] t2
输出:
ID FIELDS
------------
1 123; 456; 789
2 111
但是现在; ;每个FIELD_1
在另一个表(TABLE2
)中可以有多个条目:
FIELD_1 FIELD_2
------------------
123 A
123 B
456 B
111 C
111 X
111 Z
我需要将它们添加到我的输出中,如下所示:
ID FIELDS
------------
1 123 (A, B); 456 (B); 789
2 111 (C, X, Z)
所以我通过如下方式尝试了此操作:
select [ID],
stuff((
select '; ' + [FIELD_1] + [FIELD_2]
from [TABLE] t1
where t1.[ID] = t2.[ID]
for xml path ('')
),1,1, '') as [FIELDS]
from [TABLE] t2
left join [TABLE2] t3 on t2.[ID] = t3.[ID]
但这将为FIELD_1
中TABLE2
的每次出现返回一行。
此查询的正确方法是什么?我是否需要在现有的STUFF()
选择中使用STUFF()
?
答案 0 :(得分:1)
declare @t2 table (id int)
insert into @t2 values (1),(2)
declare @t1 table (id int, field_1 varchar(55))
insert into @t1 values (1,'123'), (1,'456'),(1,'789'),(2,'111')
declare @t3 table (field_1 varchar(55), field_2 varchar(55))
insert into @t3 values ('123','A'), ('123','B'),('456','B'),('111','C'),('111','X'),('111','Y')
select [ID],
stuff(( select '; ' + [FIELD_1]+ISNULL(' ('+[FIELDS_2]+')','')
from(
select id, [FIELD_1],
stuff((
select ',' + t3.[FIELD_2]
from @t3 t3
where t3.[FIELD_1] = t1.[FIELD_1]
for xml path ('')
),1,1, '') as [FIELDS_2]
from @t1 t1
where t1.[ID] = t2.[ID])t for xml path ('')
),1,1, '') as [FIELDS]
from @t2 t2