首頁 > 資料庫 > mysql教程 > 為什麼在 WHERE 子句中過濾右表的列時,我的左聯接表現得像內聯接?

為什麼在 WHERE 子句中過濾右表的列時,我的左聯接表現得像內聯接?

DDD
發布: 2024-12-30 03:08:10
原創
795 人瀏覽過

Why Does My Left Join Act Like an Inner Join When Filtering on the Right Table's Column in the WHERE Clause?

左連接難題:當它變成內連接時的神奇時刻

在資料庫精靈的領域中,使用左連接執行複雜的資料檢索是一種常見的做法。然而,有時,左連結的行為並不完全符合預期。

想像以下查詢:

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';
登入後複製

有趣的是,當 c.foobar 條件放置在 WHERE 子句中時,上面,所謂的左連接似乎轉變為內連接。僅當 a.foo 和 c.foobar 條件都滿足時才傳回結果。

為什麼會變態?關鍵在於WHERE子句。當在 WHERE 子句中指定左連接右側的值(右側指的是 ON 子句右側的表)時,所有 NULL 值都會被丟棄,從而有效地將左連接簡化為內部連接。簡單來說,如果 tableThree 中不存在 c.foobar,則查詢不會傳回任何行。

要繞過此困境,有兩個選項:

  1. 修改WHERE 子句以考慮有效值和NULL 值c.foobar:
AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)
登入後複製
  1. 將c.foobar條件移至連接謂詞:
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
登入後複製

在這些解決方案之間進行選擇取決於具體情況查詢的要求。然而,了解 WHERE 子句存在時左連接的基本行為對於掌握資料檢索技術至關重要。

以上是為什麼在 WHERE 子句中過濾右表的列時,我的左聯接表現得像內聯接?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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