我想知道CROSS JOIN
是否可以在任何查询中安全地替换为INNER JOIN
。
INNER JOIN
没有ON
或USING
与CROSS JOIN
完全相同吗?如果是,是否发明CROSS JOIN
类型只是为了在查询中更好地表达意图?
这个问题的附录是:
使用CROSS JOIN ... WHERE x
,INNER JOIN ... ON ( x )
或INNER JOIN ... WHERE ( x )
时,使用现代且广泛使用的DBMS会有区别吗?
谢谢。
答案 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子句的其余部分分开,使其更容易理解。