从联结表中获取多行作为逗号分隔的字符串列和映射值到临时表

时间:2014-05-29 23:06:15

标签: sql sql-server database tsql join

我已经看到了几个关于如何使用t-sql将多行组合成一个逗号分隔列的问题。我正在尝试将这些示例映射到我自己的情况,其中我还需要将两个表中的列一起引用到联结表。我不能让它发挥作用。这是我的查询:

WITH usersCSV (userEmails, siteID) 
AS (SELECT usersSites.siteID, STUFF(
        (SELECT ', ' + users.email 
        FROM users 
        WHERE usersSites.userID = users.id
        FOR XML PATH ('')
        GROUP BY usersSites.userID
    ), 1, 2, '')
    FROM usersSites
    GROUP BY usersSites.siteID
)
SELECT * FROM usersCSV

这里的难点基于this answer。我已经添加了WITH,正如我所理解的那样,它创建了一种临时表(我确定它实际上比这更复杂,但是幽默我。)来保存这些值。显然,我不需要这只是为了选择值,但我将在稍后将其与另一个表连接。 (我需要做的全部事情仍然比我在这里要做的更复杂。)

所以,我正在创建一个名为usersCSV的临时表,其中有两列我正在通过从siteID表中选择usersSites列来填充(这是{ userssites)并从我的', ' + users.email表中选择users,该表格应该为我提供逗号和空格前面的电子邮件地址。然后,我使用STUFF将前两个字符删除,并按usersSites.siteID对整个事物进行分组。

此查询给出了将第5行标识为问题区域的错误:

  

列'usersSites.userID'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

为什么这个问题应该重要,因为相关列实际上位于WHERE而不是SELECT中,如错误中所述?我该如何解决?我只需要ID与联结表中的ID匹配的用户。我有很多用户没有映射到该表中,也没有必要选择它们。

tl; dr-我需要一个临时表,一列中有不同的站点,另一列中有相关用户的电子邮件地址的逗号分隔列表。这两个数据来自其他表,并将使用这两个表的主键上的联结表放在一起。希望这是有道理的。

1 个答案:

答案 0 :(得分:2)

select distinct us.siteId,
STUFF((select ', ' + u.email
        from users u 
        join usersSites us2 on us2.userId = u.userId
        where us2.siteId = us.siteId    
        for xml path('')), 1, 2, '')
from usersSites us

SQL Fiddle