SQL:... WHERE X IN(SELECT Y FROM ...)

时间:2010-06-02 08:27:25

标签: sql

以下SQL中最有效的方法是实现其结果:

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

是否可以更好地使用连接并获得相同的结果?

5 个答案:

答案 0 :(得分:9)

任何足够成熟的SQL数据库应该能够像等效的JOIN一样有效地执行。使用任何更易读的东西。

答案 1 :(得分:6)

您可能更愿意使用JOIN而不是NOT IN的一个原因是,如果NOT IN子句中的值包含NULL个,那么{{3} }}。如果您确实使用NOT IN,请记住始终考虑子查询是否可能带回NULL值!

RE:评论中的问题

  

'x'NOT IN(NULL,'a','b')

     

≡'x'<> NULL和'x'<> 'a'和'x'<>   'B'

     

≡未知,真实和真实

     

≡未知

答案 2 :(得分:3)

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

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

答案 3 :(得分: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

答案 4 :(得分:0)

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