在简单的SQL查询中出现“NOT IN”的问题

时间:2011-09-22 08:19:57

标签: sql sql-server-2005

我需要从OldTable中找到NewT​​able中不存在的所有id 为什么这个查询不会找到id?

SELECT old_id FROM OldTable WHERE old_id NOT IN (
SELECT id FROM NewTable)  

他们自己回来了

--Returns the id 18571
SELECT old_id FROM OldTable WHERE old_id = 18571

 --Returns nothing  
SELECT id FROM NewTable WHERE id = 18571 

我错过了一些明显的东西吗?

两列都是int类型和主键。

已解决

id列中有null,我只是无知= /

这些作品:

SELECT old_id FROM OldTable EXCEPT SELECT id FROM NewTable  

SELECT * FROM old_table ot WHERE NOT EXISTS (
SELECT * FROM new_table nt WHERE nt.id = ot.old_id)  

这些不起作用:

SELECT old_id FROM OldTable LEFT JOIN NewTable ON old_id = id WHERE id IS NULL  

SELECT old_id FROM OldTable WHERE old_id NOT IN (
SELECT id FROM NewTable)

5 个答案:

答案 0 :(得分:2)

SELECT * FROM old_table ot
WHERE NOT EXISTS (
   SELECT * FROM new_table nt
   WHERE nt.new_key = ot.old_key
   );

答案 1 :(得分:2)

差异可归因于空值的存在。

考虑这两个简化的查询,注意两者的谓词是NULL = 1,其评估为UNKNOWN,分别由NOT EXISTSNOT IN处理:

SELECT *
  FROM OldTable
 WHERE NULL NOT IN (SELECT 1 FROM OldTable);

 SELECT *
  FROM OldTable
 WHERE NOT EXISTS (SELECT * FROM OldTable WHERE NULL = 1);

第一个没有返回任何行,因为NOT IN (subquery)被评估为FALSE。

第一个返回所有行,因为NOT EXISTS (subquery)被评估为TRUE。

结论:避免空值。

答案 2 :(得分:1)

我不知道为什么你的查询没有给你想要的结果,但我知道使用NOT IN效率不高。你最好使用连接:

SELECT old_id 
FROM OldTable 
LEFT JOIN NewTable
    ON old_id = id
WHERE id IS NULL

答案 3 :(得分:0)

SELECT old_id FROM OLDTable WHERE id not in (SELECT id from NewTable);

您在第一个查询中的where条件中使用old_id,并且您在第二个查询中使用id

答案 4 :(得分:0)

select oldtable.id as orginal, newtable.id as new 
from oldtable 
left outer join newtable 
on oldtable.id =newtable.id 
where new is null

AFAIK(我不是专家 - 检查我的代表;-)左外连接是一个很好的技术..它将可能执行一个不在,并且不需要一个子选择

@onedaywhen友好地指出,情况并非总是如此。在SQL Server中,EXISTS()可以更高效。