sqlserver从multitable中获取

时间:2015-07-06 13:54:53

标签: sql-server

我有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的
莫娜|台式电脑

1 个答案:

答案 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)