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