【发布时间】:2012-05-05 01:11:26
【问题描述】:
假设我有以下 T-SQL 代码:
SELECT * FROM Foo f
INNER JOIN Bar b ON b.BarId = f.BarId;
WHERE b.IsApproved = 1;
下面的也返回相同的一组行:
SELECT * FROM Foo f
INNER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId);
这可能不是这里最好的案例示例,但是这两者之间有什么性能差异吗?
【问题讨论】:
-
这里有一个类似的问题:stackoverflow.com/questions/2509987/…
-
机器会自己计算出来并适当优化。但是,对于需要在多年后调试\修改\支持您的代码的人,请将过滤条件保留在
WHERE中,并将连接条件保留在ON中。 -
@KM。我并不总是知道如何区分什么是连接条件和什么是过滤器。例如in this answer我认为它在连接中更好,那么这是一个“连接条件”吗? Here's another example 我什至不知道如何重写等效的 where 子句。
-
连接条件为:
tableA.column = tableB.column过滤条件为tableA.Column=5。进行外部连接(左/右)时,您必须将过滤条件放在ON内或以这种方式对WHERE编码(tableA.Column=5 OR tableA.Column IS NULL)
标签: sql sql-server tsql sql-server-2008-r2 inner-join