【问题标题】:SQL Joint query for unmatched rows in left tableSQL Join查询左表中不匹配的行
【发布时间】:2015-06-16 05:22:13
【问题描述】:
我有两张桌子,sfuser 和会员
sfuser 得到 139,会员表得到 50
我需要查询来选择谁不是任何项目的成员,这意味着 89 个成员
这是我的查询
select sfuser.id,sfuser.username,sfuser.email from sfuser INNER JOIN projectmembership ON sfuser.id = projectmembership.member_id ;
但是我得到了我想要的 50 个会员用户
请给我一点光
最好的问候
萨蒂什
【问题讨论】:
标签:
mysql
sql
sql-server
postgresql
join
【解决方案1】:
select
sfuser.id,
sfuser.username,
sfuser.email
from sfuser
LEFT JOIN projectmembership ON sfuser.id = projectmembership.member_id
WHERE
projectmembership.member_id is NULL
它应该返回所有不在 projectmembership 表中的用户。
【解决方案2】:
INNER JOIN 只会生成匹配两个表的行。您可以进行左连接并过滤掉空白记录。类似:
SELECT sfuser.id,
sfuser.username,
sfuser.email
FROM sfuser LEFT JOIN projectmembership ON sfuser.id = projectmembership.member_id
WHERE (projectmembership.member_id is null);
【解决方案3】:
内连接将返回所有行,其中完成连接的值在两个表之间共享。 (见this chart)
您要查找的是左连接,即左表中所有在右表中没有匹配的行。
select sfuser.id,
sfuser.username,
sfuser.email
from sfuser
LEFT JOIN projectmembership
ON sfuser.id = projectmembership.member_id
【解决方案4】:
如果 sfuser 记录可以在项目成员表中多次出现,那么忘记外连接 -- NOT EXISTS 就是你想要的:
select sid,
username,
email
from sfuser
where not exists (
select null
from projectmembership
where sfuser.id = projectmembership.member_id);