是下面最高效的SQL实现其结果是:SQL:... WHERE X IN(选择Y FROM ...)
SELECT *
FROM Customers
WHERE Customer_ID NOT IN (SELECT Cust_ID FROM SUBSCRIBERS)
莫非一些使用的连接更好,达到同样的结果?
是下面最高效的SQL实现其结果是:SQL:... WHERE X IN(选择Y FROM ...)
SELECT *
FROM Customers
WHERE Customer_ID NOT IN (SELECT Cust_ID FROM SUBSCRIBERS)
莫非一些使用的连接更好,达到同样的结果?
原因之一,你可能更愿意使用一个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
≡未知
也许尝试这个
Select cust.*
From dbo.Customers cust
Left Join dbo.Subscribers subs on cust.Customer_ID = subs.Customer_ID
Where subs.Customer_Id Is Null
任何足够成熟的SQL数据库应能同样有效地执行,作为等价JOIN
。使用任何更易读的东西。
+1这是正确的 - SQL Server将“NOT IN”和“NOT EXISTS”类型的查询变成相同的执行计划。 – eddiegroves 2010-06-02 10:41:38
SELECT Customers.*
FROM Customers
WHERE NOT EXISTS (
SELECT *
FROM SUBSCRIBERS AS s
JOIN s.Cust_ID = Customers.Customer_ID)
当使用“NOT IN”,该查询执行嵌套全表扫描,而对于“NOT EXISTS”,查询可以在子查询中使用的索引。
取决于数据库 - SQL Server将生成相同的执行计划并执行索引查找(其中索引存在) – eddiegroves 2010-06-02 10:43:22
如果您想知道哪个更有效,应该尝试查看估计的查询计划或执行后的实际查询计划。它会告诉你查询的成本(我觉得CPU和IO成本很有趣)。如果几乎没有差别,我不会感到惊讶,但你永远不知道。我看到某些查询在我们的数据库服务器上使用了多个核心,而同一个查询的重写版本只能使用一个核心(不用说,使用全部4个核心的查询的速度提高了3倍)。从来没有真正把我的手指放在这是为什么,但是如果你正在处理大型的结果集,那么在你不知情的情况下会发生这种差异。
您是否说SELECT'A'WHERE'x'NOT IN(NULL,'a','b')会返回一个空的结果? – CJ7 2010-06-02 10:37:42
@克雷格 - 是的。 – 2010-06-02 10:38:37