1

可能的重复:
WHERE 子句在 IN 和 JOIN 之前或在
INNER JOIN 之后与 WHERE 子句相比更好地执行——有什么区别吗?

如果有的话,以下之间有什么区别?

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

4 回答 4

0

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

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

于 2011-05-03T21:31:23.463 回答
0

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

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

我要提出两点意见:

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

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

于 2011-05-03T22:38:50.763 回答
0

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

此外,根据您的 SQL Server 版本,ANSI-89 语法已弃用,可能会给您带来问题。请参阅SR0010:在连接表或视图时避免使用不推荐使用的语法 事实上,在下一版本 SQL 2011 或 Denali 或我们所称的任何版本中,将不支持 ANSI-89 语法。请参阅:SQL Server 下一版本不支持的功能 (搜索单词“join”)。

于 2011-05-03T22:39:31.513 回答
0

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

于 2011-05-03T22:25:31.103 回答