我已经看到了几个关于如何使用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
列来填充(这是{ users
和sites
)并从我的', ' + users.email
表中选择users
,该表格应该为我提供逗号和空格前面的电子邮件地址。然后,我使用STUFF
将前两个字符删除,并按usersSites.siteID
对整个事物进行分组。
此查询给出了将第5行标识为问题区域的错误:
列'usersSites.userID'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。
为什么这个问题应该重要,因为相关列实际上位于WHERE
而不是SELECT
中,如错误中所述?我该如何解决?我只需要ID与联结表中的ID匹配的用户。我有很多用户没有映射到该表中,也没有必要选择它们。
tl; dr-我需要一个临时表,一列中有不同的站点,另一列中有相关用户的电子邮件地址的逗号分隔列表。这两个数据来自其他表,并将使用这两个表的主键上的联结表放在一起。希望这是有道理的。
答案 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