sql - 如何将多行作为字符串合并到一行中?

标签 sql sql-server

我有两个“一对多”表:

表1

ID    Name
1     Abe
2     David
3     Orly

表2

ID    email
1     a@zz.com
1     ab@zz.com
1     abe@zz.com
2     dav@zz.com
2     d@zz.com
3     orly@zz.com
3     o@zz.com

我需要这样的输出:

1 Abe a@zz.com, ab@zz.com, abe@zz.com
2 David dav@zz.com, d@zz.com
3 Orly orly@zz.com, o@zz.com

我知道这行不通,因为内部 SELECT 不是单个字符串:

SELECT 
    ID, Name, 
    (SELECT email FROM Table2  WHERE Table2.ID = Table1.ID) AS emails 
FROM Table1

我尝试申请:

DECLARE @emails VARCHAR(999)

SELECT [ID],[Name], 
     (SELECT @emails = COALESCE(@emails + ', ', '') + [email] 
      FROM Table2) AS 'emails' 
FROM Table1

但运气不佳。

这个问题应该如何解决?

谢谢。

最佳答案

实现这一目标的最巧妙方法之一是将 For XML Path 和 STUFF 组合起来,如下所示:

SELECT
    ID, Name, 
    Emails = STUFF((
        SELECT ', ' + Email FROM Table2 WHERE Table2.ID = Table1.ID
        FOR XML PATH ('')),1,2,'')
FROM Table1

关于sql - 如何将多行作为字符串合并到一行中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7958816/

相关文章:

PHP + MySQL SQL语法错误

SQL Server - 选择最近的记录以生成更改列表

sql - 将一列值拆分为多列值

SQL Left Join 仅第一个匹配项

SQL 将 INSERT SELECT 也转换为 UPDATE

php - MySQL 括号?

sql - PostgreSQL:错误:关系列不存在

c# - 如何实现历史版本控制?

sql-server - 为什么要使用交叉Apply来获取XML中的值?

java - JAVA中数据类型的转换