【问题标题】:Sql join notation: Is this equivalent to inner or full join?Sql 连接表示法:这相当于内部连接还是完全连接?
【发布时间】: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。我想这就是为什么它最终会抛出异常。

标签: sql syntax


【解决方案1】:

原来的概念等价于内连接。

使用“where”语法,任何外连接(左外连接、右外连接、全外连接)都没有标准等效项。 Oracle 支持“+”语法,表示左外连接和右外连接。

另外,在where子句中省略条件相当于交叉连接。

但是,您应该习惯在 from 子句中使用连接语法。一旦习惯了,查询的意图就会更加清晰,而且更不容易出错。

【讨论】:

  • 哈,别担心,我知道怎么写连接。我正在重写一个系统,当我正在浏览原始代码时,我只是想确保我正确理解它。
  • 我知道 SQL Server 有一个星号表示左/右连接,但它现在可能已被弃用。
  • @BrandonMoore:只是为了强调 Gordon 的观点(如果您在等待 不同的 答案),您不能使用 WHERE 语法来制作等效于外部加入,而FULL JOIN 一个外部联接。所以你在那里,你的第一个 sn-p 不是 FULL JOIN 的等价物。
  • @AndriyM 直到我在一秒钟前进行了几次测试之前,我可以发誓有一个边缘案例。我终于想起了我的想法:打开或关闭 ANSI_NULLS 时的行为差异。我认为此设置不会影响连接。但实际上,它以相同的方式影响连接条件:事实证明,它不会影响列与列的比较,无论它是处于 where 条件还是连接条件。
  • @BrandonMoore:我几乎不记得那个设置了,因为我从来没有在我参与过的项目中使用它,也从来不需要。结果,我对它在各种情况下的影响知之甚少。我的意思是,我当然可以根据对设置本质上的变化的了解来计算出其中的一些,如果不是全部的话,但是没有什么可以代替一个好的、彻底的实验。因此,感谢您回来分享您的测试结果!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
  • 2017-09-12
  • 2012-08-15
  • 2012-01-06
相关资源
最近更新 更多