左連接和WHERE 子句的怪癖
在執行資料擷取操作時,開發人員經常使用左連接來組合來自多個表的資訊。然而,當將 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'
直觀上,人們會希望該語句在 tableThree 和 tableTwo 之間執行左連接,指定 c.foobar 的過濾條件。然而,包含 c.foobar = 'somethingelse' 的 WHERE 子句的存在無意中改變了左連接的特徵。
當左連接右側的值(在本例中為 c.foobar)為包含在 WHERE 子句中時,只有值為 NOT NULL 的行才會包含在結果集中。因此,左連接的行為實際上類似於內部連接,消除了 c.foobar.
的所有具有 NULL 值的行。要保留上例中左連接的預期行為,可以採用以下任一方法方法:
以上是左連結和 WHERE 子句:它們如何交互,以及如何避免意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!