是的,標準外連接和Informix樣式外連接的語義存在差異,這不可避免地意味着查詢計劃中存在差異。
通常,對於任何新的或修改的代碼使用標準符號 - 對於(不變的)遺留代碼保留Informix樣式的外部連接符號,並且最好甚至更新以使用新的連接符號。
有什麼區別?公平的問題 - 很難解釋,更難以提出一個好的(合理的例子)。基本上,即使存在基於外連接表中的值來拒絕這些行的條件,Informix樣式表示法也會保留「顯性」表(非外表)中的行。
這兩個查詢產生相同的結果:
SELECT i.*, o.*
FROM DominantTable AS i, OUTER OuterJoinedTable AS o
WHERE i.pk_column = o.fk_column;
SELECT i.*, o.*
FROM DominantTable AS i
LEFT OUTER JOIN OuterJoinedTable AS o
ON i.pk_column = o.fk_column;
這兩個查詢不一定產生相同的結果:
SELECT i.*, o.*
FROM DominantTable AS i, OUTER OuterJoinedTable AS o
WHERE i.pk_column = o.fk_column
AND (o.alt_column IS NULL OR o.alt_column = 1);
SELECT i.*, o.*
FROM DominantTable AS i
LEFT OUTER JOIN OuterJoinedTable AS o
ON i.pk_column = o.fk_column
WHERE (o.alt_column IS NULL OR o.alt_column = 1);
的差額,在這樣的情況發生:
DominantTable OuterJoinedTable
pk_column other_column fk_column alt_column
1 twenty 1 3
標準LEFT OUTER JOIN表示法將生成空集作爲結果。在Informix風格的加入會產生的結果:
pk_column other_column fk_column alt_column
1 twenty null null
從DominantTable的數據是沒有拒絕的,因爲上占主導地位的表格過濾條件,所以它是由Informix的保留。標準聯接執行外部聯接,然後篩選結果。
很酷的答案,但性能怎麼樣 – kubek2k
但假設我們只使用條件加入 - 查詢是否會一樣? – kubek2k
閱讀我的答案 - 它說什麼? –