Sql 查找不在组织中的用户

Sql 查找不在组织中的用户,sql,join,Sql,Join,鉴于这些数据: users id name == ==== 1 Alice 2 Bob 3 Carl organizations id name == ==== 1 Aaa 2 Bbb memberships id organization_id user_id == =============== ======= 1 1

鉴于这些数据:

users
  id    name
  ==    ====
  1     Alice
  2     Bob
  3     Carl

organizations
  id    name
  ==    ====
  1     Aaa
  2     Bbb

memberships
  id    organization_id   user_id
  ==    ===============   =======
  1     1                 1
  2     2                 1
  3     1                 2
我想查找不属于特定组织X的用户:

  • 完全没有会员记录的用户

  • 具有成员资格记录的用户,但不适用于组织X

例如,我希望用户不在组织2中。我期待着:

users.id
========
2
3
尝试使用此联接不起作用:

SELECT *
FROM users left join memberships on memberships.user_id = users.id
where memberships.id is null or memberships.organization_id <> 1
选择*
从用户左侧加入memberships.user_id=users.id上的成员身份
其中memberships.id为null或memberships.organization\u id为1
它返回用户1,2,3,因为1在第二个where条件上匹配


有没有一种有效的方法可以做到这一点?

将您的加入限制为2人组织,然后测试null是实现您想要的目标的一种方法,例如

SELECT * 
FROM   users 
       LEFT JOIN memberships 
         ON memberships.user_id = users.id 
            AND memberships.organization_id = 2 
WHERE  memberships.id IS NULL 
您也可以在

SELECT * 
FROM   users 
WHERE id NOT IN (SELECT user_id from memberships where organization_id = 2 )

编辑:修改为包括所有用户

您还可以使用减号集运算符:

从用户中选择“名称” 减
从用户u内部加入成员m on u.id=m.user\u id内部加入组织o on m.organization\u id=o.id和o中选择“name”=“name”=“X”

下面是使用exists子句的另一个选项:

 select * from users
 where not exists 
    (select memberships.id from memberships 
      inner join organizations on memberships.organization_id = organizations.id 
      and memberships.user_id = users.id
      where organizations.id = 2)

这似乎不包括完全没有会员资格的用户。@jemminger尝试修改后的查询。谢谢,花了一些时间摸索,但我现在明白了!
select Users.*
from users 
inner join memberships 
on Users.id = memberships.id
left join organizations 
on memberships.organization_id = organizations.id 
where memberships.id is null  AND memberships.organization_id = 2 
 select * from users
 where not exists 
    (select memberships.id from memberships 
      inner join organizations on memberships.organization_id = organizations.id 
      and memberships.user_id = users.id
      where organizations.id = 2)