左聯接與內聯接
在 SQL 中,左聯接與內聯接是產生不同結果集的兩種基本聯結類型。左聯接會傳回左表中的所有行,並根據聯結條件匹配右表中的行。如果未找到匹配項,則右側表中的缺失值將表示為 NULL。相反,內部聯結僅傳回滿足聯結條件的行,排除兩個表中不符合該條件的行。
左聯結行為修改
中提供的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'
後面存在WHERE c.foobar = 'somethingelse' 子句LEFT JOIN 條件具有令人驚訝的效果。它似乎會將左聯接轉換為內聯接,如果 tableThree 中不存在“somethingelse”,則不會傳回任何行。
解釋
這看起來很奇怪行為是由 SQL 語句的評估順序產生。 WHERE 子句在執行連線後進行處理。因此,當在 WHERE 子句中指定 c.foobar = 'somethingelse' 時,它會有效地過濾掉所有左連接中 c.foobar 為 NULL 的行。因此,只有 c.foobar 與指定值('somethingelse')相符的行才會保留在最終結果集中。
解
保持所需的左連接行為,有兩個選項:
修改WHERE 子句以修改包含OR c.foobar IS NULL,如下所示:
WHERE a.foo = 'something' AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)
這允許c.foobar 為 NULL 的行包含在結果集中。
移動c.foobar = 'somethingelse' 與左連接的ON 子句進行比較,確保結果中僅包含滿足該條件的行設定:
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
以上是左連接與內連接:WHERE 子句如何影響左連接的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!