2011-04-21 52 views
23

我想知道CROSS JOIN是否可以在发现任何查询时用INNER JOIN安全替换。CROSS JOIN是没有ON子句的INNER JOIN的同义词吗?

INNER JOIN没有ONUSINGCROSS JOIN完全一样吗?如果是的话,CROSS JOIN类型是否只是为了更好地表达查询而发明的?

对这个问题的附录是:

还能有使用差异现代化和使用CROSS JOIN ... WHERE xINNER JOIN ... ON (x)INNER JOIN ... WHERE (x)时广泛使用的DBMS?

谢谢。

回答

20

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

某些数据库(如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) 

意志。

+0

谢谢你的回答。根据“INNER JOIN”的标准,“ON”条件是强制性的吗? – Benoit 2011-04-21 11:15:39

+0

@Benoit:根据'SQL-92',它不是。不过,我没有'2003'或'2008'的副本。除'MySQL'之外的所有数据库都需要它。 – Quassnoi 2011-04-21 11:22:20

+0

@Quassnoi:SQLite没有。 – Benoit 2011-04-21 11:44:44

2

原始交叉连接是一个没有where子句的意思,表示每个左右表的组合都会产生一个记录,并且在没有左侧或右侧数据的情况下插入空值。

如果将一个where子句添加到交叉联接中,这使得它与内部联接等价,因为where子句与内部联接中的ON做的事情相同。

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

+3

在您的第一段中,您很混淆了CROSS和OUTER联接。用空表交叉连接会产生空的结果。 – Benoit 2011-04-21 12:07:47