2017-03-29 111 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

相關問題