最近,我遇到了一个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
答案 0 :(得分:4)
旧语法是SQL反模式。任何时候你应该用内连接替换它。它为反模式的部分原因是因为如果省略了where clasues则判断是否有交叉连接是不可能的。这会导致许多意外的交叉连接,特别是在复杂的查询中。此外,在某些数据库(特别是Sql server)中,implict外连接无法正常工作,因此人们尝试将显式和隐含连接组合在一起,并在没有意识到的情况下获得不良结果。总而言之,即使考虑使用隐含连接也是一种不好的做法。
答案 1 :(得分:0)
是的,您的两个陈述将返回相同的结果。使用哪一个是品味问题。如果可能的话,每个理智的数据库系统都将使用连接,没有理智的优化器在第一种情况下真正使用交叉产品。
但请注意,您的第一个语法是不交叉连接。它只是一个连接的隐式表示法,它没有指定要使用哪种连接。相反,优化器必须检查WHERE
子句以确定是使用内连接还是交叉连接:如果在WHERE
子句中找到适用的连接条件,则将导致内连接。如果没有找到这样的子句,则会导致交叉连接。由于您的第一个示例指定了适用的连接条件(WHERE A.NUM = B.NUM
),因此会产生INNER JOIN
,因此与您的第二个案例完全相同。