內部聯接(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信息爲空)。
你的意思是,我們爲什麼需要加入標準? – dasblinkenlight
不,我的意思是在表c的eft連接中,括號中寫入的條件的含義是什麼,爲什麼我們需要寫這個?爲什麼我不能使用簡單的where子句?我曾嘗試在相同表和連接上使用簡單的where子句,但結果不同。 –
這個SQL已經被現在有人寫給我了。 –