首頁 > 資料庫 > mysql教程 > 左連結和 WHERE 子句:它們如何交互,以及如何避免意外結果?

左連結和 WHERE 子句:它們如何交互,以及如何避免意外結果?

DDD
發布: 2024-12-31 18:05:12
原創
993 人瀏覽過

Left Joins and WHERE Clauses: How Do They Interact, and How Can I Avoid Unexpected Results?

左連接和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 子句: 將c.foobar = 'somethingelse' 替換為允許的條件對於NULL 值,例如AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)。
  • 將過濾器移至連接謂詞: 修改 LEFT JOIN 子句如下:LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'。透過將過濾器放置在連接本身中,左側連接的行為保持不變,因為 c.foobar 中的 NULL 值仍然保留。

以上是左連結和 WHERE 子句:它們如何交互,以及如何避免意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板