WHERE 子句中左聯接的行為
在SQL 中,左聯接旨在包含左表中的所有行,即使存在右表中沒有符合的行。但是,某些條件可以改變此預設行為。
考慮以下查詢:
SELECT a.foo, b.bar, c.foobar FROM tableOne AS a INNER JOIN tableTwo AS b ON a.pk = b.fk LEFT JOIN tableThree AS c ON b.pk = c.fk WHERE a.foo = 'something' AND c.foobar = 'somethingelse'
在此查詢中,tableTwo 和tableThree 之間的左聯實際上被轉換為內聯接,因為WHERE 子句中的條件c.foobar = 'somethingelse'。這是因為在 WHERE 子句中從左聯接的右側指定非 NULL 值(此處為「somethingelse」)會消除任何對應列為 NULL 的行,從而導致內聯行為。
因此,查詢僅傳回 tableOne 和 tableTwo 中與 tableThree 中具有非 NULL 值 c.foobar 的行相符的行。要保持所需的左連接行為,請考慮以下解決方案:
1.在WHERE 子句中包含NULL:
將條件c.foobar = ' somethingelse' 替換為AND (c.foobar = 'somethingelse' OR c.foobar IS NULL) 以包含foobar 為 '的行其他'或 NULL。
2.將條件移到連接謂詞:
將c.foobar = 'somethingelse' 條件從WHERE 子句移到連接謂詞:
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
藉由這樣做,查詢保留左連接行為,同時仍根據c.foobar 的值過濾掉行。
以上是WHERE 子句如何影響 SQL 中 LEFT JOIN 的行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!