2015-06-22 200 views
1
SELECT A.COL1, B.COL1,C.COL1 
FROM TABLEA A 
LEFT JOIN TABLEB B ON A.COL1 = B.COL1 
LEFT JOIN TABLEC C ON (
     C.COL3 IS NOT NULL 
     AND (
       C.COL2 = 664 
       AND A.COL1 = C.COL1 
     ) 
) 

關於SQL的技術性,LEFT JOIN TABLE C ON之後括號內的條件是什麼意思?爲什麼這些必要?LEFT JOIN(OUTER JOIN)與INNER JOIN的條件

+0

你的意思是,我們爲什麼需要加入標準? – dasblinkenlight

+0

不,我的意思是在表c的eft連接中,括號中寫入的條件的含義是什麼,爲什麼我們需要寫這個?爲什麼我不能使用簡單的where子句?我曾嘗試在相同表和連接上使用簡單的where子句,但結果不同。 –

+0

這個SQL已經被現在有人寫給我了。 –

回答

0

早期版本的ANSI SQL不包含連接條件的ON子句 - 它對所有內容都使用where子句。這對於內部連接來說很好,但是隨着數據庫應用程序開始使用外部連接,這種方法出現了一些問題。你們中的一些人可能還記得*==*的原始ANSI-89時代語法。這些用於謂詞來定義外部聯接的行爲。在這種情況下,我們除了從A保留不匹配的行正常行從連接返回:

SELECT A.COL1, B.COL1,C.COL1 
FROM TABLEA A 
LEFT JOIN TABLEB B ON A.COL1 = B.COL1 
LEFT JOIN TABLEC C ON (
     C.COL3 IS NOT NULL 
     AND (
       C.COL2 = 664 
       AND A.COL1 = C.COL1 
     ) 
) 

這是非常有用的,當你試圖找出在查詢中會發生什麼。它有助於語義上定義應從聯接中返回的一組行。

ON子句:這個語法允許您爲ON子句用於連接表,其中列名不兩個表中同時匹配表 在加入主鍵指定的列名。連接條件將從WHERE子句中的過濾條件中刪除。

+0

該報價不清楚和困惑。加盟是在條件下,而不是「兩個表中的關鍵」;任何兩個表都可以在任何情況下或沒有情況下加入。最後一句話沒有意義;但是如果查詢編寫器或實現從WHERE到ON「移除」條件,那麼通常它必須在任何OUTER JOIN之後評估的非OUTER連接的ON。 – philipxy

1

內部聯接(JOIN或INNER JOIN,CROSS JOIN或逗號)首先進行交叉連接。 (Ie返回可以通過從左表追加一行並從右表追加一行的所有行)。然後,任何ON都會刪除不符合條件的行。對於左表(LEFT)或右表(右)或兩個表(FULL),OUTER JOIN返回相應INNER JOIN 的行,任何不匹配的行使用NULL擴展。 FROM WHERE刪除不符合條件的行後。

如果某個條件處於ON狀態,則會在FROM中刪除匹配的行。但是如果這個條件是在WHERE中,那麼匹配行和通過後面的連接合並它們的任何行仍然會被刪除。所以如果一個FROM只有內部連接,那麼無論是條件是ON還是WHERE都無關緊要。

但是,如果FROM具有條件上的OUTER JOIN,那麼刪除不滿足條件的交叉連接行並添加某些NULL擴展的行,而將該條件移至WHERE則刪除而不添加。

該語言沒有必要爲INNER JOIN開啓,因爲替代t1 INNER JOIN t2 ON condition可能涉及到(SELECT * FROM t1 INNER JOIN t2 WHERE condition)

從上面可以得出以下結論:對於任何最後一個OUTER JOIN(包括沒有OUTER JOIN)的INNER JOIN序列,可以在ON和WHERE之間自由移動條件。但不適用於任何最後的OUTER JOIN或之前的ON,因爲它們可能會影響其輸入,因此會影響輸出NULLed行。如果這樣的條件從ON移到WHERE,沒有理由期待相同的結果。

對於您的代碼:可能查詢的目的是將A.COL1作爲ID與關聯的A,B和C信息一起使用,但是那些沒有包含B信息的信息仍然包含在內(B & C信息爲NULL)和那些做但沒有C信息或做,但沒有非空C.COL3或做,但沒有C.COL2 = 664然而包括(C信息爲空)。

+0

感謝您的好回答,會有很好的例子.. –

0

隨着OUTER JOINC可能是NULL因爲沒有匹配A.COL1.

如果是這樣的話,那就永遠不會C.COL2 = 664意味着任何WHERE語句會扔掉的行。

通過將條件放入ON子句中,您要求應用於JOIN條件,而不是作爲結果的篩選器。

對於非外部聯接,它沒有區別。