【问题标题】:Concatenate multiple SQL rows into single column in SQL Server 2008在 SQL Server 2008 中将多个 SQL 行连接成单个列
【发布时间】:2021-10-15 06:32:19
【问题描述】:

我有 3 张桌子

用户

user_id  name
1        mike

Assigned_Bosses

user_id  boss_id
1        3
1        5

老板

boss_id  boss_email
3        foo@bar.com
5        test@bar.com

如何选择一个用户,以便我可以在单行中获取所有老板的电子邮件,用;分隔?

name  boss_email
mike  foo@bar.com;test@bar.com  

以下显然行不通,但这是我想要做的:

SELECT concat(b.boss_email), u.name
FROM Users u
LEFT OUTER JOIN Assigned_Bosses a ON a.user_id = u.user_id
LEFT OUTER JOIN Bosses b ON b.boss_id = a.boss_id 
WHERE user_id = 1

这也是 SQL Server 2008,因此并非所有功能都可用。

【问题讨论】:

标签: sql sql-server-2008


【解决方案1】:

您可以使用以下查询

SELECT
       name,
       STUFF((SELECT ';' + b.boss_email
         FROM Users u
         LEFT OUTER JOIN Assigned_Bosses a ON a.user_id = u.user_id
         LEFT OUTER JOIN Bosses b ON b.boss_id = a.boss_id 
         WHERE u.user_id = 1
         for xml path(''), TYPE).value('text()[1]', 'NVARCHAR(MAX)'),1,LEN(';'),'')
from Users
where user_id = 1

db<>fiddle中的演示

【讨论】:

    【解决方案2】:

    在 SQL Server 内置字符串连接函数之前,实现相同的传统方法是 for xml 'hack'。

    要在您的示例数据上实现这一点,您可以尝试

    select u.name, Stuff((
        select  ';' + b.boss_email 
        from Assigned_Bosses a 
        left join Bosses b on b.boss_id = a.boss_id 
        where a.user_id = u.user_id
        for xml path(''),type
    ).value('.','varchar(max)'),1,1,'') as Boss_Email
    from users u
    where u.user_id=1
    

    注意 - 我在 2008 年没有任何测试方法,但我相信这应该可行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-11
      • 2016-11-22
      相关资源
      最近更新 更多