簡體   English   中英

SQL Server(MSSql)不存在

[英]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

權限是映射到組還是用戶?

  • 如果同一組中的兩個用戶可以具有不同的權限,則可能他們不應該在同一組中,或者該組層不是必需的並且可以刪除。
  • 如果權限基於組,則“映射”不應具有user_id字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM