2011-04-21 54 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