TSQL选择一对多。在Select语句中将多个列/行连接到一个列/行

TSQL选择一对多。在Select语句中将多个列/行连接到一个列/行,tsql,select,Tsql,Select,我有一个一对多的select语句 我希望多个列中的一列的结果显示为一行中的一列。最简单的方法是什么 表1 1 Joe 2 Jill 3 Bill 4 Jennifer 表2 1 Red 1 Yellow 1 Blue 2 Green 2 Black 4 Purple 结果 1 Joe Red, Yellow, Blue 2 Jill Green, Black 3 Bill 4 Jennifer Pur

我有一个一对多的select语句

我希望多个列中的一列的结果显示为一行中的一列。最简单的方法是什么

表1

1   Joe   
2   Jill
3   Bill
4   Jennifer
表2

1    Red
1    Yellow
1    Blue
2    Green
2    Black
4    Purple
结果

1   Joe      Red, Yellow, Blue
2   Jill     Green, Black
3   Bill
4   Jennifer Purple

如果您有2017或Azure,则可以使用它。如果不是,则显示for xml路径方法:

很可能是你最好的选择


但正如您在Aaron的博客中所看到的:如果可以,string_Agg()是一种选择。

如果您使用的是Sql server 2017或Sql Azure,那么您可以使用string_Agg,如下所示:

Select t1.Id, t1.Name, String_agg(color,',') from #table1 t1
left join #table2 t2 on t1.Id = t2.Id
Group by t1.Id, t1.Name
Select t1.Id, t1.Name, Colors = stuff((select ','+color from #table2 tt2 where tt2.id = t1.id for xml path('')),1,1,'')
    From #table1 t1
Group by t1.Id, t1.Name
+----+----------+-----------------+
| Id |   Name   |     Colors      |
+----+----------+-----------------+
|  1 | Joe      | Red,Yellow,Blue |
|  2 | Jill     | Green,Black     |
|  3 | Bill     | NULL            |
|  4 | Jennifer | Purple          |
+----+----------+-----------------+

如果您使用的是SQL Server,请查找组_Concat()或列表_Agg()的TSQL等效项,您将在MSFT中找到使用stuff和xml path或可能的
string_Agg()
所需的内容,具体取决于db的版本。所以tSQL的哪个版本(假设是MSFT而不是Sybase,Sybase也是tSQL)?在select QUERY中使用+和isnull(columnname“”)。假设可以使用递归CTE显示了几个示例。xml路径似乎是最有效的,尽管它不是公认的答案。如果字符串_Agg()可用,则它似乎是性能最好的狗。可能与