可能重复:
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中具有相同的行为,
答案 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”一词)。