[英]SQL Server (MSSql) not exists
我在選擇四個表上的數據時遇到問題。 首先是
用戶數
id | group_id | username
1 10 foo
2 10 bar
3 20 barfoo
第二個是
團體
id | groupname
10 foo
20 bar
is是
映射
group_id | user_id | permission_id
10 1 100
10 1 200
10 2 100
20 3 300
20 3 400
最后
權限
id | value | group_id
100 A 10
200 B 10
300 B 20
400 A 20
我要執行的操作是選擇具有權限“ A”但沒有權限“ B”的用戶,這是一種合理性檢查,因為處於同一農作物的用戶具有相同的權限,在這種情況下,用戶欄應是唯一的結果。 也許有人暗示? 謝謝!
接下來呢? 具有具有權限A但沒有權限B的組的SELECT用戶。子查詢與針對USERS表的外部查詢相關。
SELECT *
FROM USERS U
WHERE EXISTS (
SELECT *
FROM MAPPING M, PERMISSIONS P
WHERE M.permission_id = P.permission_id
AND M.group_id = U.group_id
AND P.value = 'A')
AND NOT EXISTS (
SELECT *
FROM MAPPING M, PERMISSIONS P
WHERE M.permission_id = P.permission_id
AND M.group_id = U.group_id
AND P.value = 'B')
不僅可以做到這一點,例如,還可以計算每個用戶的權限的不同值,僅檢查一個不同的值,並檢查該值是否為“ A”
SELECT u.id, u.username
FROM Users u
INNER JOIN mapping m ON u.id = m.user_id
INNER JOIN permissions p ON m.permission_id = p.id
GROUP BY u.id, u.username
HAVING COUNT(DISTINCT p.Value) = 1
AND MAX(p.Value) = 'A'
或者有可能檢索具有權限“ A”的所有用戶,而不是除去具有另一權限的所有用戶
SELECT u.id, u.username
FROM Users u
INNER JOIN mapping m ON u.id = m.user_id
INNER JOIN permissions p ON m.permission_id = p.id
WHERE p.Value = 'A'
EXCEPT
SELECT u.id, u.username
FROM Users u
INNER JOIN mapping m ON u.id = m.user_id
INNER JOIN permissions p ON m.permission_id = p.id
WHERE p.Value <> 'A'
或者有可能以其他方式做到這一點。
那就是讓我們檢查一下您的數據模式
Users
id | group_id | username
Groups
id | groupname
Mapping
group_id | user_id | permission_id
Permissions
id | value | group_id
權限是映射到組還是用戶?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.