SQL Join右侧限制左表

时间:2017-10-31 21:45:27

标签: sql join

我需要执行一个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]

我不知道如何用可以工作的东西替换那个括号(或完全重做查询)。

2 个答案:

答案 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;