我需要执行一个SQL查询,我在其中提取表1中的用户,或者根本不在表2中,或者不在表2的特定子集中。
这就是我所拥有的:
表ClientUsers
ID用户名
1用户1
2用户2
3用户3
4用户4
5用户5
表UserRoles
ClientUsersID ClientRolesID
1个101
2个166
5个103
我需要选择所有在UsersRoles中的用户,其中任何ClientRoleID不是166或者根本不在用户角色中。
所以在这种情况下,我会选择用户1和3-5。 1和5因为它们在UserRoles表中具有166和3以外的角色,因为它们在表ClientUsers中但不是表UserRoles。
我无法在WHERE语句中使用null,因为它在列中查找空值,而不是不存在的行。
我认为我必须使用完全外连接,然后缩小结果范围,但我还没有找到可用的查询。
SELECT * FROM dbo.ClientUsers
FULL OUTER JOIN dbo.UserRoles on ClientUsers.ID = UserRoles.ClientUsersID
WHERE UserRoles.ClientRolesID != 166 OR [value not in right table]
我不知道如何用可以工作的东西替换那个括号(或完全重做查询)。
答案 0 :(得分:1)
使用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
);
这几乎是您的问题陈述的直接翻译。
答案 1 :(得分:0)
这个怎么样?
SELECT *
FROM dbo.ClientUsers
FULL OUTER JOIN dbo.UserRoles on ClientUsers.ID = UserRoles.ClientUsersID
WHERE UserRoles.ClientRolesID != 166 or UserRoles.ClientRolesID is NULL;