在 SQL SERVER 中,我需要在与另一个表联接的同时从一个表输出行数据,并且第二个表中的列数据应通过单个查询用逗号隔开。如果第二个表中没有匹配的行,则应显示NULL。以下是表格。
Table 1 Table 2
ID Name Tlb1_ID CITY
1 A 1 ZZ
2 B 1 XX
3 C 2 GG
4 D 2 HH
5 E 3 JJ
我希望输出如下 结果
ID Name CITY
1 A ZZ,XX
2 B GG,HH
3 C JJ
4 D NULL
5 E NULL
答案 0 :(得分:0)
一个小东西可以做到这一点,看这个例子。
declare @table1 table(ID int, Name varchar(10))
declare @table2 table(ID int, tbl1_ID int, City varchar(10))
insert into @table1 values (1, 'A'), (2, 'B'), (3, 'C'), (4, 'D'), (5, 'E')
insert into @table2 values (1, 1, 'ZZ'), (2, 1, 'XX'), (3, 2, 'GG'), (4, 2, 'HH'), (5, 3, 'JJ')
select t1.ID,
t1.Name,
stuff(( ( select ', ' + t2.City
from @table2 t2
where t2.tbl1_ID = t1.ID
For XML PATH (''))
), 1, 2, '') as Citys
from @table1 t1
结果是
ID Name Citys
-- ---- -----
1 A ZZ, XX
2 B GG, HH
3 C JJ
4 D null
5 E null
答案 1 :(得分:0)
尝试使用string_Agg:
SELECT
tbl_1.Id
, tbl_1.Name
, STRING_AGG(tbl_2.City, ', ') AS Cities
FROM @tbl_1 tbl_1
LEFT JOIN @tbl_2 tbl_2
ON tbl_1.Id = tbl_2.Tbl1_Id
GROUP BY tbl_1.Id, tbl_1.Name
和示例数据:
DECLARE @tbl_1 TABLE
(
Id int,
Name varchar(10)
)
DECLARE @tbl_2 TABLE
(
Tbl1_Id int,
City varchar(10)
)
INSERT INTO @tbl_1
(
Id,
Name
)
VALUES
(1, 'A')
, (2, 'B')
, (3, 'C')
, (4, 'D')
, (5, 'E')
INSERT INTO @tbl_2
(
Tbl1_Id,
City
)
VALUES
( 1, 'ZZ')
, ( 1, 'XX')
, ( 2, 'GG')
, ( 2, 'HH')
, ( 3, 'JJ')
输出:
Id Name Cities
1 A ZZ, XX
2 B GG, HH
3 C JJ
4 D NULL
5 E NULL
答案 2 :(得分:0)
Subselect将为每个ID返回以逗号分隔的城市名称。这是通过for xml path
和stuff
stuff((SELECT ',' + city FROM #tbl2 where #tbl2.Tlb1_ID = t1.ID FOR XML PATH ('')),1,1,'') CITY
查询
select
t1.*,
stuff((SELECT ',' + city FROM #tbl2 where #tbl2.Tlb1_ID = t1.ID FOR XML PATH ('')),1,1,'') CITY
from #tbl1 t1