2010-06-02 102 views
20

是下面最高效的SQL实现其结果是:SQL:... WHERE X IN(选择Y FROM ...)

SELECT * 
    FROM Customers 
WHERE Customer_ID NOT IN (SELECT Cust_ID FROM SUBSCRIBERS) 

莫非一些使用的连接更好,达到同样的结果?

回答

6

原因之一,你可能更愿意使用一个JOIN而不是NOT IN是,如果NOT IN子句中值包含任何NULL是你会always get back no results。如果您确实使用NOT IN,请记住始终考虑子查询是否可能带回NULL值!

RE:问题中的注释

'X' NOT IN(NULL, 'A', 'B')

≡的 'x' <> NULL和 'X' <>“一'和 'X' <> 'b'

≡未知和True和True

≡未知

+0

您是否说SELECT'A'WHERE'x'NOT IN(NULL,'a','b')会返回一个空的结果? – CJ7 2010-06-02 10:37:42

+2

@克雷格 - 是的。 – 2010-06-02 10:38:37

2

也许尝试这个

Select cust.* 

From dbo.Customers cust 
Left Join dbo.Subscribers subs on cust.Customer_ID = subs.Customer_ID 
Where subs.Customer_Id Is Null 
9

任何足够成熟的SQL数据库应能同样有效地执行,作为等价JOIN。使用任何更易读的东西。

+4

+1这是正确的 - SQL Server将“NOT IN”和“NOT EXISTS”类型的查询变成相同的执行计划。 – eddiegroves 2010-06-02 10:41:38

3
SELECT Customers.* 
    FROM Customers 
WHERE NOT EXISTS (
     SELECT * 
     FROM SUBSCRIBERS AS s 
     JOIN s.Cust_ID = Customers.Customer_ID) 

当使用“NOT IN”,该查询执行嵌套全表扫描,而对于“NOT EXISTS”,查询可以在子查询中使用的索引。

+2

取决于数据库 - SQL Server将生成相同的执行计划并执行索引查找(其中索引存在) – eddiegroves 2010-06-02 10:43:22

0

如果您想知道哪个更有效,应该尝试查看估计的查询计划或执行后的实际查询计划。它会告诉你查询的成本(我觉得CPU和IO成本很有趣)。如果几乎没有差别,我不会感到惊讶,但你永远不知道。我看到某些查询在我们的数据库服务器上使用了多个核心,而同一个查询的重写版本只能使用一个核心(不用说,使用全部4个核心的查询的速度提高了3倍)。从来没有真正把我的手指放在这是为什么,但是如果你正在处理大型的结果集,那么在你不知情的情况下会发生这种差异。

相关问题