CROSS JOIN是没有ON子句的INNER JOIN的同义词吗?

时间:2011-04-21 09:34:16

标签: sql inner-join cross-join

我想知道CROSS JOIN是否可以在任何查询中安全地替换为INNER JOIN

INNER JOIN没有ONUSINGCROSS JOIN完全相同吗?如果是,是否发明CROSS JOIN类型只是为了在查询中更好地表达意图?

这个问题的附录是:

使用CROSS JOIN ... WHERE xINNER JOIN ... ON ( x )INNER JOIN ... WHERE ( x )时,使用现代且广泛使用的DBMS会有区别吗?

谢谢。

2 个答案:

答案 0 :(得分:22)

在所有现代数据库中,所有这些构造都针对同一计划进行了优化。

某些数据库(例如SQL Server)在ON之后需要INNER JOIN条件,因此您的第三个查询不会在那里解析。

表格的可见范围是JOIN顺序,因此此查询:

SELECT  *
FROM    s1
JOIN    s2
ON      s1.id IN (s2.id, s3.id)
CROSS JOIN
        s3

不会解析,而这一个:

SELECT  *
FROM    s2
CROSS JOIN
        s3
JOIN    s1
ON      s1.id IN (s2.id, s3.id)

意愿。

答案 1 :(得分:2)

原始交叉连接是一个没有where子句的连接,意味着为左表和右表的每个组合生成一条记录,并且在没有左侧或右侧数据的情况下插入空值。

如果在交叉连接中添加where子句,则使其等效于内连接,因为where子句与内连接中的ON执行相同的操作。

但是,内部联接通常更好用,因为这会将ON条件与where子句的其余部分分开,使其更容易理解。