CREATE TABLE Users(UserId int,UserName nvarchar(15), Permisions int)
CREATE TABLE Permissions(PermissionId int,Title NVARCHAR(15))
我有这个数据的权限表:
Id Title
--------------
1 'Read'
2 'Write'
4 'Update'
8 'Delete'
和用户表
Id UserName Permission
-----------------------------------
1 'David' 3
2 'Sara' 12
3 'Maryam' 15
在这种情况下' David'已阅读'并且'写'访问(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 :(得分: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
答案 1 :(得分: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