【发布时间】:2012-05-22 00:57:33
【问题描述】:
select a.somefield, b.someotherfield
from a, b
where a.key = b.key
以上是否等同于:
select a.somefield, b.someotherfield
from a join b on a.key = b.key
或:
select a.somefield, b.someotherfield
from a full join b on a.key = b.key
我很确定它等同于内部连接,但我意识到我以前从未真正考虑过它。另外我想知道是否有任何边缘情况不是 100% 等效的?
【问题讨论】:
-
相当于内连接(我相信 100% 的情况)。关于连接的维基百科文章清楚地指出,顺便说一句,这些是等价的:)。
-
@Corbin 是的,100% 的时间。我原以为如果 ANSI_NULLS 设置为 OFF,可能会有不同的行为。我错误地认为 ANSI_NULLS 不会影响连接,但它不会影响列到列的比较(无论它们是在 where 还是 join 表达式中)
-
在任何情况下都不能保证 null = null 为真。无论是 join 子句还是 where 子句,都必须使用 IS NULL。
-
@Corbin 如果 ANSI_NULLS 关闭,则 null = null 保证为真 IF 您没有比较单独的列。在 SQL Server 的未来版本中,将 ANSI_NULLS 设置为关闭可能会导致异常,但目前还不是这样。
-
有趣...大约 4 年没有接触过 MSSQL。虽然禁用标准行为的标志有点...... bleh。我想这就是为什么它最终会抛出异常。