CONTEXT个
我正在使用SQL Server 2016.我try 按用户表的id
和username
分组,并从角色表中获取roleDesc
,作为逗号分隔值.
- 由
#mapTable
映射#userTable
和#roleTable
表. - 一个用户可以拥有多个角色
所需结果:
id | username | roleDesc |
---|---|---|
1 | user1 | role1,role2 |
2 | user1 | role2 |
Issue个
由于我使用的是SQL Server 2016,我无法使用STRING_AGG
将roleDesc
分组为逗号分隔值.
My attempt个
我试着用STUFF
,但出错了.
IF(OBJECT_ID('Tempdb..#userTable') IS NOT NULL)
DROP TABLE #userTable
CREATE TABLE #userTable
(
id int,
username nvarchar(200)
)
INSERT INTO #userTable
VALUES (1, 'user1'),
(2, 'user2')
IF (OBJECT_ID('Tempdb..#roleTable') IS NOT NULL)
DROP TABLE #roleTable
CREATE TABLE #roleTable
(
id int,
roleDesc nvarchar(200)
)
INSERT INTO #roleTable
VALUES (1, 'role1'),
(2, 'role2'),
(3, 'role3')
IF(OBJECT_ID('Tempdb..#mapTable') IS NOT NULL)
DROP TABLE #mapTable
CREATE TABLE #mapTable
(
id int,
map_userId int,
map_roleId int
)
INSERT INTO #mapTable
VALUES (1, 1, 1),
(2, 1, 2),
(3, 2, 2)
SELECT
U.id,
U.username,
-- STRING_AGG(R.roleDesc,',') roleDesc --> this works in SQL Server 2017
STUFF ((SELECT
',' + R.roleDesc
FROM
#roleTable T
WHERE
T.id = R.id
FOR XML PATH('')), 1, 1, '') AS roleDesc
FROM
#userTable U
JOIN
#mapTable MAP ON MAP.map_userId = U.id
JOIN
#roleTable R ON R.id = MAP.map_roleId
GROUP BY
U.id, U.username
我提到的链接:
-
https://stackoverflow.com/a/19348687/7067740个
-
STUFF
内的where
子句ID最终用于外部查询GROUP BY
.我的情况并非如此.
-
-
https://stackoverflow.com/a/56964302/7067740个
- 这更接近我所需的解决方案,但是
STUFF
查询有一个更简单的WHERE
子句.我无法将其翻译为我的 case .
- 这更接近我所需的解决方案,但是
我得到了这个错误:
列‘#roleTable.id’在 Select 列表中无效,因为它既未包含在聚合函数中,也未包含在GROUP BY子句中.
Question个
另一种方法可能是什么?