【问题标题】:Which join syntax is better?哪种连接语法更好?
【发布时间】:2012-06-30 09:25:38
【问题描述】:

所以我们正在从 Informix 迁移到 Sql Server。而且我注意到在 Informix 中查询是以这种方式编写的:

select [col1],[col2],[col3],[col4],[col5]
from tableA, tableB
where tableA.[col1] = table.[gustavs_custom_chrome_id]

而我在 SQL Server 中编写的所有查询都写成:

select [col1],[col2],[col3],[col4],[col5]
from tableA 
inner join tableB on tableA.[col1] = table.[gustavs_custom_chrome_id]

现在,我的第一个想法是:第一个查询很糟糕。它可能会创建这个巨大的记录集,然后使用 Where 子句减少到实际的记录集。因此,这对性能不利。而且它不是ansi。所以它是双重坏的。

但是,经过一番谷歌搜索后,从理论上讲,它们似乎几乎相同。它们都符合 ANSI 标准。

所以我的问题是:

  1. 两个查询的执行方式相同吗? IE。运行速度一样快,并且总是给出相同的答案。
  2. 两者都真正符合 ANSI 标准吗?
  3. 有什么突出的理由让我应该推崇一种风格而不是另一种风格?还是我应该独自离开足够好?


    注意:这些只是查询的示例。我见过一些查询(第一类)一次最多连接 5 个表。

【问题讨论】:

  • 在这里看到一篇关于它的好帖子:sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/…
  • @spender 好吧,您链接到的那个问题被关闭为“不是一个真正的问题”。所以你是说我的问题“不是一个真正的问题”吗?因为我当然不同意。
  • Informix 中的旧代码是使用旧样式“FROM 子句中的表名逗号列表”编写的。新代码是使用新的(如自 1992 年 SQL 标准以来的)符号和显式 JOIN 操作编写的。使用新样式。时期。讨论完毕。仅将旧样式视为旧样式 - 升级 ASAC(方便时尽快)。
  • 我在使用旧的 Informix 表示法时从来没有遇到过问题。您是否彻底分析了迁移到 SQL Server 的利弊?

标签: sql-server tsql join informix ansi


【解决方案1】:

嗯,“更好”是主观的。这里有一些风格。但我会直接解决你的问题。

  1. 两者执行相同
  2. 两者都符合 ANSI。
  3. 第一个例子的问题在于

    • 很容易无意中导出叉积(因为更容易省略连接条件)

    • 随着您将越来越多的表添加到连接中,调试连接条件也变得困难

    • 由于旧式外连接(*=)语法已被弃用(it has long been documented to return incorrect results),当您需要引入外连接时,您需要混合使用新式和旧式连接...为什么要推广不一致?

    • 虽然它并不是最佳实践的权威,但Microsoft recommends explicit INNER/OUTER JOIN syntax

    • 用后一种方法:

      • 无论内部/外部如何,您都使用一致的连接语法
      • 意外导出叉积更难(并非不可能)
      • 将连接条件与过滤条件分开可以使调试更容易

我写了the post Kevin pointed to

【讨论】:

  • SQL Server 甚至早在 SQL Server 2000 就可能误解旧式左连接。请参阅在线书籍。
  • 是的,我根本没有提倡使用旧式外连接。我应该将它添加到那个项目符号中。
  • @JonathanLeffler:我认为*=/=* 只是 SQL Server。您的意思是 Oracle 使用 (+) 语法 进行外连接吗?
  • 啊!你是对的,@AndriyM;它是 Sybase/SQL Server 使用 *=,Oracle 使用 (+),Informix 使用 OUTER(与 SQL 标准完全不同的方式),而且……在有标准之前,每个人都用自己不同的方式来做标准方式。
  • 如果不使用额外的联合查询,您将无法使用旧语法执行 FULL OUTER JOIN..
猜你喜欢
  • 2016-09-07
  • 1970-01-01
  • 2013-04-25
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
相关资源
最近更新 更多