【发布时间】:2013-08-11 19:08:19
【问题描述】:
做类似的事情有区别吗
SELECT *
FROM table1 INNER JOIN table2 ON table2.ObjectId = table1.table2ObjectId
WHERE table2.Value = 'Foo'
对比
SELECT *
FROM table1 INNER JOIN table2
ON table2.ObjectId = table1.table2ObjectId AND table2.Value = 'Foo'
【问题讨论】:
-
两者都有效。您是否看到了意想不到的副作用?
-
是的,我有一个相当复杂的查询,其中包含许多内部联接,只需将 where 条件移动到内部联接的一部分就会有所不同。这很奇怪,因为您会认为它们是相同的。
-
如果查询完全由内部连接组成,它不会影响结果(除非您的查询使用可能因计划而异的非确定性结构)。提出一个关于包含查询和结果的新问题。
-
即使它对结果集无关紧要,table2.Value = 'Foo' 也应该在 WHERE 子句中,因为它并不是加入表。不确定它是否有助于查询优化器。这是另一个很好的相关问题:stackoverflow.com/questions/2509987/…
-
@DarrinDoherty 这很有趣,因为第一个查询中的结果返回 table2.Value 相等且不等于 'Foo' 的记录。而第二个查询只返回等于 'Foo' 的记录。
标签: sql sql-server