【发布时间】:2012-12-29 23:15:08
【问题描述】:
以下两个 SQL 查询返回相同的结果:
SELECT * FROM Table1
WHERE Table1.Value1 = 'something' OR Table1.Value2 IN (SELECT Value2 FROM Table2)
SELECT * FROM Table1
LEFT JOIN Table2
ON Table1.Value2 = Table2.Value2
WHERE (Table1.Value1 = 'something' OR Table2.Value2 IS NOT NULL)
同样,这两个查询返回相同的结果:
SELECT * FROM Table1
WHERE Table1.Value1 = 'something' AND Table1.Value2 NOT IN (SELECT Value2 FROM Table2)
SELECT * FROM Table1
LEFT JOIN Table2
ON Table1.Value2 = Table2.Value2
WHERE Table1.Value1 = 'something' AND Table2.Value2 IS NULL
就个人而言,我发现使用“IN”或“NOT IN”的选项更容易阅读(特别是因为我的实际查询中已经有一堆连接)。但是,如果 Table2 中的值越来越多(目前只返回三个结果),这个查询会不会变得低效?或者查询优化器会在幕后把它找出来并把它变成一个连接吗?我正在使用 SQL Server 2012。
【问题讨论】:
-
对于第一个查询,WHERE EXISTS 将比您提供的两个选项更有效(或者在最坏的情况下,效率不会更低)。有关第二种选择的非常彻底的处理,请参阅sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join
-
@AaronBertrand:您提供的链接描述了
ANTI JOIN,而不是SEMI JOIN。这些是完全不同的。 -
@Quassnoi 问题中的第二个代码示例谈到了
ANTI SEMI JOIN。 -
@AaronBertrand:你是对的,我的错!
标签: sql-server sql-server-2012 where-in