SQL Server中INNER JOIN和cartesian join的区别

4

可能重复:
内连接和全连接的区别

这两者之间有什么区别,特别是在 SQL Server 2008 中?

select * from table1 t1, table2 t2 where t1.col1 = t2.col1

select * from table1 t1 INNER JOIN table2 t2 ON t1.col1 = t2.col1

优化器对此没有区别——第一种使用ANSI-89连接语法,第二种使用更受欢迎的ANSI-92语法。我个人会尽可能清除ANSI-89语法,然后在各种社交媒体上找出罪魁祸首=) - OMG Ponies
第二个不起作用,因为你的“where”应该是“on”? - Ben
笛卡尔积有时被用作外连接(笛卡尔乘积)的同义词 - 可能适合更改标题,但不知道这是否是旧语法的正确术语。 - dfb
3
一种就像用莎士比亚英语说话,另一种则像使用现代口语英语。请使用今天的语言! 翻译:其中一种说话方式类似于使用莎士比亚时代的英语,另一种则类似于使用现代口语英语。请使用当今通用语言! - Gordon Linoff
在较新版本的SQL Server中,您不能使用隐式语法来进行左连接,如果尝试将它们组合在一起,则结果可能不正确。 - HLGEM
显示剩余2条评论
2个回答

2

它们是相同的。

但是,如果您想要对不同的表执行INNER JOIN然后再执行OUTER JOIN,考虑一下您的语法会是什么样子。

遵循INNER JOIN的语法更加一致,这样以后如果需要修改SQL,就更容易做到。此外,一致性可以让其他人更好地了解您的意图。


谢谢回复。这两个查询给了我不同的输出。实际行输出是相同的,但第一个查询给了我多次相同的行作为结果(次数等于表中的行数)。然后有人告诉我使用第二个版本。我来自PL/SQL背景,对SQL Server还不熟悉,不知道我可以这样使用它。 - cherry

1

第一种是旧的编写内连接的方式,第二种是在 SQL 中添加 join 命令后编写的方式。

只要两种方式都被接受,结果就没有任何区别。这两个查询的执行计划将是相同的。

旧的连接方式正在逐步淘汰,并且在 SQL Server 的后续版本中可能会在某些模式下被禁止使用。它不适用于 SQL Server 2008。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接