簡體   English   中英

SQL Join 通過右限制左表

[英]SQL Join limiting left table by right

我需要做一個 SQL 查詢,在那里我拉出表 1 中的用戶,或者根本不在表 2 中,或者不在表 2 的特定子集中。

這是我所擁有的:

表客戶端用戶
用戶名
1 用戶 1
2 用戶 2
3 用戶 3
4 用戶 4
5 用戶 5

表用戶角色
ClientUsersID ClientRolesID
1 101
2 166
5 103

我需要選擇屬於 UsersRoles 且 ClientRoleID 不是 166 或根本不在 User Roles 中的所有用戶。

所以在這種情況下,我會選擇用戶 1 和 3-5。 1 和 5 是因為它們在 UserRoles 表中,角色不是 166,3 和 4 是因為它們在 ClientUsers 表中,但根本不是 UserRoles 表。

我無法在 WHERE 語句中使用空值,因為它會在列中查找空值,而不是不存在的行。

我認為我必須使用完整的外連接,然后縮小結果的范圍,但我還沒有找到一個有效的查詢。

SELECT * FROM dbo.ClientUsers 
 FULL OUTER JOIN dbo.UserRoles on ClientUsers.ID = UserRoles.ClientUsersID  
 WHERE UserRoles.ClientRolesID != 166 OR [value not in right table]

我不知道如何用可以工作的東西替換那個括號(或完全重做查詢)。

使用not exists

SELECT cu.*
FROM dbo.ClientUsers cu
WHERE NOT EXISTS (SELECT 1
                  FROM dbo.UserRoles ur
                  WHERE cu.ID = ur.ClientUsersID AND ur.ClientRolesID = 166 
                 );

這幾乎是您問題陳述的直接翻譯。

這個怎么樣?

 SELECT *
    FROM dbo.ClientUsers
         FULL OUTER JOIN dbo.UserRoles on ClientUsers.ID = UserRoles.ClientUsersID
  WHERE UserRoles.ClientRolesID != 166 or UserRoles.ClientRolesID is NULL;

暫無
暫無

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

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