不在与不存在

这些查询中哪个更快?

不存在。

SELECT ProductID, ProductName 
FROM Northwind..Products p
WHERE NOT EXISTS (
    SELECT 1 
    FROM Northwind..[Order Details] od 
    WHERE p.ProductId = od.ProductId)

或不在。

SELECT ProductID, ProductName 
FROM Northwind..Products p
WHERE p.ProductID NOT IN (
    SELECT ProductID 
    FROM Northwind..[Order Details])

查询执行计划说它们都是做同样的事情。 如果是这样的话,哪种形式是推荐的?

这是以NorthWind数据库为基础的。

[编辑]

刚发现这篇有帮助的文章。 http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx

我想我将坚持使用 "不存在"。

如果执行计划者说它们是一样的,那么它们就是一样的。使用哪一个会使你的意图更明显--在这种情况下,就是第二个。

评论(2)

实际上,我相信这将是最快的。

SELECT ProductID, ProductName 
    FROM Northwind..Products p  
          outer join Northwind..[Order Details] od on p.ProductId = od.ProductId)
WHERE od.ProductId is null
评论(4)

这取决于...

SELECT x.col
FROM big_table x
WHERE x.key IN( SELECT key FROM really_big_table );

会不会比较慢,并没有什么限制查询的大小,看看他们的键是否在里面。在这种情况下,EXISTS是比较好的。

但是,根据DBMS的优化器,这可能没什么不同。

举个例子说明什么时候EXISTS更好

SELECT x.col
FROM big_table x
WHERE EXISTS( SELECT key FROM really_big_table WHERE key = x.key);
  AND id = very_limiting_criteria
评论(2)