SQL Server 2016:我想查询table1并返回所有条目,除非在table2的相应列中匹配。
我认为这样可行:
select *
from table1
where table1.jobno not in(select jobno from dbo.table2)
但是没有记录。有超过1000条记录,其中table1.jobno不在table2中。如何正确地做到这一点?
答案 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
就更简单了。