以下SQL中最有效的方法是实现其结果:
SELECT *
FROM Customers
WHERE Customer_ID NOT IN (SELECT Cust_ID FROM SUBSCRIBERS)
是否可以更好地使用连接并获得相同的结果?
答案 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倍)。从来没有真正理解为什么会这样,但如果你正在处理大型结果集,那么在你不知道的情况下就会发生这种差异。