SQL - 列出那些不匹配的

时间:2015-12-08 11:26:23

标签: sql sql-server database

我写了下面的查询,但我意识到我需要它做与目前相反的事情。

我需要在UG中显示每个人都有一个payroll_no,这个数字在esr中不存在。

select distinct ug.name, ug.payroll_no, esr.assignment 
from user_group as ug
inner join esrtraining as esr 
on ug.payroll_no = SUBSTRING(esr.assignment,2,8)

任何帮助表示赞赏。感谢。

3 个答案:

答案 0 :(得分:4)

请试试这个。这利用了LEFT JOIN,它将ug表中的所有内容后跟WHERE子句,该子句过滤并仅带来那些不满足匹配条件的记录

select distinct ug.name, ug.payroll_no, esr.assignment 
from user_group as ug
LEFT join esrtraining as esr 
on ug.payroll_no = SUBSTRING(esr.assignment,2,8) 
WHERE 
esr.assignment is NULL

答案 1 :(得分:3)

您需要执行LEFT JOIN,这会将所有esr字段保留为NULL。从那里,您只需使用WHERE esr.assignment IS NULL过滤该结果。

出于这个原因,esr.assignment当然在您的选择中始终为空。

答案 2 :(得分:1)

您表达问题的方式是解决问题的好方法:使用not exists

select ug.name, ug.payroll_no
from user_group as ug
where not exists (select 1
                  from esrtraining as esr 
                  where ug.payroll_no = SUBSTRING(esr.assignment, 2, 8)
                 );

除非您在user_group中有重复项,否则不应该使用distinct。