选择除了与另一个表匹配的所有内容

时间:2018-03-27 18:54:11

标签: sql sql-server sql-server-2016

SQL Server 2016:我想查询table1并返回所有条目,除非在table2的相应列中匹配。

我认为这样可行:

select * 
from table1 
where table1.jobno not in(select jobno from dbo.table2) 

但是没有记录。有超过1000条记录,其中table1.jobno不在table2中。如何正确地做到这一点?

2 个答案:

答案 0 :(得分:1)

通过在Table2中仅查看为空来进行左连接并消除

SELECT
Table1.* 
FROM Table1
LEFT JOIN Table2 ON Table1.JobNo=Table2.JobNo
WHERE ISNULL(Table2.JobNo,'')=''

另一种方式

SELECT * FROM Table1 WHERE JobNo in (
    (
    SELECT JobNo from Table1
    EXCEPT 
    SELECT JobNo from Table2
    )
)

答案 1 :(得分:1)

NOT IN与子查询一起使用会很危险。为什么?因为如果子查询返回的任何值为NULL,它会返回 no 记录。

出于这个原因,我强烈建议您改为使用NOT EXISTS

select t1.* 
from table1 t1
where not exists (select 1 from dbo.table2 t2 where t2.jobno = t1.jobno);

您可以使用left join / where not null或在子查询中包含where子句来获得相同的效果:

select t1.* 
from table1 t1
where t1.jobno not in (select t2.jobno from dbo.table2 t2 where t2.jobno is not null);

但我认为只使用not exists就更简单了。