Sql 交叉连接差分问题

Sql 交叉连接差分问题,sql,sql-server,join,inner-join,cross-join,Sql,Sql Server,Join,Inner Join,Cross Join,可能的重复项: 以下各项之间有什么区别(如有) Select col1, col2 from TableA A, TableB B where A.ID = B.ID 及 它们在SQL中似乎具有相同的行为,RDBMS可能会将它们优化为相同的行为。它们都连接A.ID=B.ID标准上的表 但是,JOIN语法是明确的,被认为是正确的 前者是ANSI-89语法,后者是ANSI-92语法。后者几乎总是应该使用的,因为当您开始使用ANSI-92语法表示的外部联接时,它会更加清晰。第一种语

可能的重复项:

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

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


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

RDBMS可能会将它们优化为相同的行为。它们都
连接
A.ID=B.ID
标准上的表


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

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

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

这两个语句的输出将是相同的,并且如果您使用的系统具有良好的优化器,那么性能也将是相同的

我想提出两点意见:

1) 我发现在写陈述时最好明确你的意图。如果要执行内部联接,请使用内部联接语法。未来你6个月的形式现在将感谢


2) 在这种情况下,SQL Server中的优化器将执行内部联接(至少是最新版本,不能保证所有版本),但它对路径的猜测程度取决于SQL Server引擎的版本,不能保证将来保持不变(我怀疑在这种情况下它会改变,但再输入几个字符的成本真的那么高吗?)@ypercube正确地指出,您的问题是关于两种不同的内部联接语法。您没有任何外部联接语法。正如@Matt Whitfield所指出的,第一种语法是ANSI-92,第二种是ANSI-89样式。我完全同意Matt的观点,即在更复杂的查询中,ANSI-92语法更具可读性


此外,根据您的SQL Server版本,ANSI-89语法已被弃用,可能会给您带来问题。请参阅事实上,在SQL 2011或Denali的下一个版本中,或无论我们如何称呼它,ANSI-89语法将不受支持。请参阅:(搜索“join”一词).

请注意,这不是一个
交叉联接
。两个查询都是
内部联接
s。
Select 
  col1, 
  col2
From TableA A
Inner Join TableB B on A.ID = B.ID