SQL INNER JOIN实现为隐式JOIN

时间:2014-09-22 14:33:36

标签: sql inner-join hsqldb cross-join

最近,我遇到了一个SQL查询,如下所示:

SELECT * FROM A, B WHERE A.NUM = B.NUM

对我而言,似乎这将与INNER JOIN完全相同:

SELECT * FROM A INNER JOIN B ON A.NUM = B.NUM

为什么有人会在这里使用CROSS JOIN有什么理由吗?编辑:好像大多数SQL应用程序会在这里自动使用INNER JOIN

数据库为HSQLDB

2 个答案:

答案 0 :(得分:4)

旧语法是SQL反模式。任何时候你应该用内连接替换它。它为反模式的部分原因是因为如果省略了where clasues则判断是否有交叉连接是不可能的。这会导致许多意外的交叉连接,特别是在复杂的查询中。此外,在某些数据库(特别是Sql server)中,implict外连接无法正常工作,因此人们尝试将显式和隐含连接组合在一起,并在没有意识到的情况下获得不良结果。总而言之,即使考虑使用隐含连接也是一种不好的做法。

答案 1 :(得分:0)

是的,您的两个陈述将返回相同的结果。使用哪一个是品味问题。如果可能的话,每个理智的数据库系统都将使用连接,没有理智的优化器在第一种情况下真正使用交叉产品。

但请注意,您的第一个语法是交叉连接。它只是一个连接的隐式表示法,它没有指定要使用哪种连接。相反,优化器必须检查WHERE子句以确定是使用内连接还是交叉连接:如果在WHERE子句中找到适用的连接条件,则将导致内连接。如果没有找到这样的子句,则会导致交叉连接。由于您的第一个示例指定了适用的连接条件(WHERE A.NUM = B.NUM),因此会产生INNER JOIN,因此与您的第二个案例完全相同。

相关问题