CROSS JOIN是没有ON子句的INNER JOIN的同义词吗?
我想知道CROSS JOIN
是否可以在发现任何查询时用INNER JOIN
安全替换。CROSS JOIN是没有ON子句的INNER JOIN的同义词吗?
是INNER JOIN
没有ON
或USING
跟CROSS JOIN
完全一样吗?如果是的话,CROSS JOIN
类型是否只是为了更好地表达查询而发明的?
对这个问题的附录是:
还能有使用差异现代化和使用CROSS JOIN ... WHERE x
,INNER JOIN ... ON (x)
或INNER JOIN ... WHERE (x)
时广泛使用的DBMS?
谢谢。
在所有现代数据库中,所有这些构造都针对相同的计划进行了优化。
某些数据库(如SQL Server
)在INNER JOIN
之后需要ON
条件,因此您的第三个查询就不会在那里解析。
表的能见度范围是在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)
意志。
原始交叉连接是一个没有where子句的意思,表示每个左右表的组合都会产生一个记录,并且在没有左侧或右侧数据的情况下插入空值。
如果将一个where子句添加到交叉联接中,这使得它与内部联接等价,因为where子句与内部联接中的ON做的事情相同。
但是,内部连接通常更好使用,因为这会将ON条件与where子句的其余部分分开,从而更易于理解。
在您的第一段中,您很混淆了CROSS和OUTER联接。用空表交叉连接会产生空的结果。 – Benoit 2011-04-21 12:07:47
谢谢你的回答。根据“INNER JOIN”的标准,“ON”条件是强制性的吗? – Benoit 2011-04-21 11:15:39
@Benoit:根据'SQL-92',它不是。不过,我没有'2003'或'2008'的副本。除'MySQL'之外的所有数据库都需要它。 – Quassnoi 2011-04-21 11:22:20
@Quassnoi:SQLite没有。 – Benoit 2011-04-21 11:44:44