【问题标题】:Cross Join difference question [duplicate]交叉连接差异问题[重复]
【发布时间】:2011-05-03 21:28:57
【问题描述】:

可能的重复:
WHERE clause better execute before IN and JOIN or after
INNER JOIN versus WHERE clause — any difference?

以下各项之间有什么区别(如果有)?

Select 
  col1, 
  col2 
from TableA A, TableB B
where A.ID = B.ID

Select 
  col1, 
  col2
From TableA A
Inner Join TableB B on A.ID = B.ID

它们在 SQL 中似乎有相同的行为,

【问题讨论】:

  • 请注意,这不是CROSS JOIN。两个查询都是INNER JOINs。

标签: sql sql-server join inner-join cross-join


【解决方案1】:

它们可能会被 RDBMS 优化为相同的东西。他们都是JOINA.ID = B.ID 标准上的表格。

但是,JOIN 语法是明确的并且被认为是正确的。

【讨论】:

    【解决方案2】:

    前者为ANSI-89语法,后者为ANSI-92语法。几乎总是应该使用后者,因为当您开始使用以 ANSI-92 语法表示的外连接时,它会更加清晰。

    【讨论】:

      【解决方案3】:

      第一种语法是(如您所指出的)两个表的交叉连接或笛卡尔积。在没有优化器(或优化器不佳)的系统中,这将生成第一个表中的每条记录与第二个表中的每条记录的组合,然后将它们过滤到仅匹配 WHERE 子句的那些。

      两个语句的输出将相同,如果您使用的系统具有良好的优化器,则性能也将相同。

      我会提供两个 cmets:

      1) 我发现在编写陈述时最好明确说明您的意图。如果您打算执行 INNER JOIN,请使用 INNER JOIN 语法。未来你 6 个月的形式现在会很感激。

      2) SQL Server 中的优化器会在这种情况下执行 INNER JOIN(至少是最近的版本,不能保证所有版本),但它对路径的猜测程度取决于 SQL Server 的版本引擎并且不保证将来保持不变(我怀疑它会在这种情况下改变,但是多输入几个字符的成本真的那么高吗?)

      【讨论】:

        【解决方案4】:

        @ypercube 正确指出您的问题是关于两种不同的 INNER JOIN 语法。您没有任何外连接语法。正如@Matt Whitfield 所指出的,第一种语法是 ANSI-92,第二种是 ANSI-89 风格。我完全同意马特的观点,即在更复杂的查询中,ANSI-92 语法更具可读性。

        此外,根据您的 SQL Server 版本,ANSI-89 语法已弃用,可能会给您带来问题。请参阅SR0010: Avoid using deprecated syntax when you join tables or views 事实上,在 SQL 2011 的下一个版本中,或 Denali,或任何我们称之为的版本中,将不支持 ANSI-89 语法。请参阅:Features Not Supported in the Next Version of SQL Server (搜索单词“join”)。

        【讨论】:

          猜你喜欢
          • 2011-09-05
          • 2013-05-24
          • 1970-01-01
          • 2011-06-18
          • 2015-10-18
          • 1970-01-01
          • 1970-01-01
          • 2012-10-07
          • 2011-07-19
          相关资源
          最近更新 更多