交叉加入差异问题

时间:2011-05-03 21:28:57

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

  

可能重复:
  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中具有相同的行为,

4 个答案:

答案 0 :(得分:0)

它们可能会被RDBMS优化为同一个东西。他们JOIN条件A.ID = B.ID上的JOIN表格。

但是,{{1}}语法是明确的并且被认为是正确的。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

两个语句的输出都是相同的,如果你使用的系统有一个好的优化器,那么性能也是一样的。

我会提供两条评论:

1)我发现在编写语句时要明确你的意图。如果您打算执行INNER JOIN,请使用INNER JOIN语法。你现在6个月的未来表现将会很感激。

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

答案 3 :(得分:0)

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

此外,根据您的SQL Server版本,ANSI-89语法是DEPRECATED并且可能会给您带来问题。请参阅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”一词)。