在資料庫精靈的領域中,使用左連接執行複雜的資料檢索是一種常見的做法。然而,有時,左連結的行為並不完全符合預期。
想像以下查詢:
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,則查詢不會傳回任何行。
要繞過此困境,有兩個選項:
AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
在這些解決方案之間進行選擇取決於具體情況查詢的要求。然而,了解 WHERE 子句存在時左連接的基本行為對於掌握資料檢索技術至關重要。
以上是為什麼在 WHERE 子句中過濾右表的列時,我的左聯接表現得像內聯接?的詳細內容。更多資訊請關注PHP中文網其他相關文章!