2017-03-29 79 views
2
CREATE TABLE Users(UserId int,UserName nvarchar(15), Permisions int) 
CREATE TABLE Permissions(PermissionId int,Title NVARCHAR(15)) 

我有这个权限表与此数据:如何在sql中查找所有用户的所有权限?

Id Title 
-------------- 
1 'Read' 
2 'Write' 
4 'Update' 
8 'Delete' 

和用户表

Id UserName Permission 
----------------------------------- 
1 'David'  3 
2 'Sara'  12 
3 'Maryam' 15 

在这种情况下, '大卫' 具有 '读' 和 '写' 访问(1+2=3) “萨拉'有'更新'和'删除'访问(4+8=12) 和'Maryam'有'读','写','更新'和'删除'访问(1+2+4+8=15)

如何加入在SQL和查询该表与下面的结果

UserName  Title 
------------------------------  
'David'   'Read' 
'David'   'Write' 
'Sara'   'Update' 
'Sara'   'Delete' 
'Maryam'  'Read' 
'Maryam'  'Write' 
'Maryam'  'Update' 
'Maryam'  'Delete' 
+0

我贴一个简单的(我觉得...)选择 – etsa

回答

2

你可以试试吗?

CREATE TABLE P (ID INT, TITLE VARCHAR(20)); 
CREATE TABLE U (ID INT, UNAME VARCHAR(20), PERM INT); 

INSERT INTO P VALUES (1,'Read'); 
INSERT INTO P VALUES (2,'Write'); 
INSERT INTO P VALUES (4,'Update'); 
INSERT INTO P VALUES (8,'Delete'); 
INSERT INTO U VALUES (1,'DAvid', 3); 
INSERT INTO U VALUES (1,'Sara', 12); 
INSERT INTO U VALUES (1,'Maryam', 15); 

    SELECT * 
    FROM U 
    CROSS JOIN P 
    WHERE U.PERM & P.ID>0; 

输出:

ID   UNAME    PERM  ID   TITLE 
----------- -------------------- ----------- ----------- -------------------- 
1   DAvid    3   1   Read 
1   DAvid    3   2   Write 
1   Sara     12   4   Update 
1   Sara     12   8   Delete 
1   Maryam    15   1   Read 
1   Maryam    15   2   Write 
1   Maryam    15   4   Update 
1   Maryam    15   8   Delete 
4

假设在较低级别的权限都包含在较高水平,这将工作...

with CTE as 
(
select p.*, sum(id) over (order by id) as p_level 
from PermissionTable p 
) 
select u.*, p.* 
from UserTable u 
inner join CTE p 
on u.permission >= p.p_level 

否则

with CTE as 
(
select a.Title, a.id + b.id as p_level 
from PermissionTable a 
cross join PermissionTable b 
) 
select u.*, p.* 
from UserTable u 
inner join CTE p 
on u.permission = p.p_level 
+0

无效的对象名称的UserLevel“ –

+0

@ElhamAzadfar这是一个错字 – JohnHC

相关问题