联接表并在一行中显示第二个表数据

时间:2019-04-09 11:17:52

标签: sql-server

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

3 个答案:

答案 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 pathstuff

实现的
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