我有3张桌子 用户表(存储用户信息) 模块表(存储有关平台的信息) 权限表(存储用户ID和模块ID)
权限表存储有关特定模块的用户权限的信息
现在我想从这3个表中获取输出,它应该看起来像“sql query的输出”
用户表
用户ID |名称
1 |查理
2 |莫纳
权限表
ID |用户ID | Mudule ID
1 | 1 | 1
2 | 1 | 2
3 | 2 | 1
模块表
模块ID |名称
1 |台式电脑
2 | Android的
3 | IPhone
查询输出
名称|许可1 |许可2 |许可n
查理|台式电脑| Android的
莫娜|台式电脑
答案 0 :(得分:1)
您可以尝试以下操作:
SELECT pvt.*
FROM (
SELECT u.name as username, m.[Module Id], m.name as modulename
FROM users as u
INNER JOIN Permissions as p
ON u.[User Id] = p.[User Id]
INNER JOIN Modules as m
ON p.[Module Id] = m.[Module Id]
) as data
PIVOT (
MAX(data.modulename)
FOR m.[Module Id] IN([1],[2])
) as pvt
您仍然需要根据您的真实姓名调整表名和列。 : - )
如果您需要动态解决方案,则可能需要运行此代码:
DECLARE @sql nvarchar(max), @columns nvarchar(max)
SELECT @columns = COALESCE(@columns + N',['+CONVERT(nvarchar(max),[module Id])+']',
N'['+CONVERT(nvarchar(max),[module Id])+']')
FROM (
SELECT DISTINCT [module ID]
FROM Modules
) as cols
SET @sql = N'
SELECT pvt.*
FROM (
SELECT u.name as username, m.[Module Id], m.name as modulename
FROM users as u
INNER JOIN Permissions as p
ON u.[User Id] = p.[User Id]
INNER JOIN Modules as m
ON p.[Module Id] = m.[Module Id]
) as data
PIVOT (
MAX(data.modulename)
FOR m.[Module Id] IN('+@columns+')
) as pvt'
EXEC(@sql)