4

所以我们正在从 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 个表。
4

1 回答 1

17

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

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

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

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

    • 由于旧式外连接 (*=) 语法已被弃用(它早已被记录为返回不正确的结果),当您需要引入外连接时,您需要混合使用新式和旧式连接...为什么要推广不一致?

    • 虽然它不完全是最佳实践的权威,但Microsoft 建议使用明确的 INNER/OUTER JOIN 语法

    • 使用后一种方法:

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

我写了凯文指出的帖子

于 2012-06-28T19:47:04.730 回答