有條件的 LEFT JOIN:ON 和 WHERE 之間的差異在哪裡?
在 SQL Server 中,LEFT JOIN 根據下列條件組合來自兩個資料表的資料列指定的連接條件。 ON 子句定義 LEFT JOIN 語句中的聯結條件,而 WHERE 子句則在聯結操作之後過濾資料列。如果沒有正確理解,這種微妙的差異可能會導致意外結果。
考慮以下查詢:
SELECT t1.f2 FROM t1 LEFT JOIN t2 ON t1.f1 = t2.f1 AND cond2 AND t2.f3 > something
令人驚訝的是,此查詢不會產生與以下查詢相同的結果:
SELECT t1.f2 FROM t1 LEFT JOIN t2 ON t1.f1 = t2.f1 AND cond2 WHERE t2.f3 > something
解釋
ON子句在決定哪些行參與聯結方面起著至關重要的作用。 ON 中指定的條件必須為真,才能符合並包含在連線結果中的行。相反,WHERE 子句過濾已經連接的行。
在第一個查詢中,條件 t2.f3 > some 是 ON 子句的一部份。因此,只有 t2.f3 大於某值的行才會包含在連線中。這表示 t2.f3 不大於某值的任何符合行都將從結果中排除。
在第二個查詢中,條件 t2.f3 > > some 是 WHERE 子句的一部份。該子句在執行連接後進行評估。因此,所有滿足 ON 子句條件(t1.f1 = t2.f1 和 cond2)的行都會成為聯結結果的一部分。然後,WHERE 子句過濾這些行,只保留 t2.f3 大於某值的行。
範例
為了說明這個概念,請考慮一個候選表 (候選人)和投票表(選票)。如果我們想尋找已收到選票的候選人,我們可以使用 LEFT JOIN:
SELECT * FROM candidates c LEFT JOIN votes v ON c.name = v.voted_for
此查詢返回所有候選人,甚至包括那些沒有收到任何選票的候選人。如果我們將條件移至 WHERE 子句:
SELECT * FROM candidates c LEFT JOIN votes v ON c.name = v.voted_for WHERE v.voted_for IS NOT NULL
結果現在只包括至少獲得一票的候選人。
結論
理解 LEFT JOIN 中 ON 和 WHERE 子句的差異對於有效操作資料至關重要。透過仔細地將條件放入適當的子句中,您可以確保您的查詢傳回所需的結果。
以上是SQL 中的 LEFT JOIN:「ON」和「WHERE」子句之間的主要差異是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!