SQL 查詢中,篩選條件放在 WHERE 子句還是 JOIN ... ON 子句,對 外部連接 結果影響巨大。本文以 RIGHT OUTER JOIN 為例,實測兩種寫法差異。
TBL_SchemaDetail(方案明細)TBL_StockMaterial(物料庫存價格)MaterialNoSchemaNo = '7411'、售價 SalePrice = 0SELECT TBL_SchemaDetail.MaterialNo, TBL_StockMaterial.SalePrice
FROM TBL_StockMaterial RIGHT OUTER JOIN TBL_SchemaDetail
ON TBL_StockMaterial.MaterialNo = TBL_SchemaDetail.MaterialNo
AND TBL_SchemaDetail.SchemaNo = '7411'
AND TBL_StockMaterial.SalePrice = 0
SELECT TBL_SchemaDetail.MaterialNo, TBL_StockMaterial.SalePrice
FROM TBL_StockMaterial RIGHT OUTER JOIN TBL_SchemaDetail
ON TBL_StockMaterial.MaterialNo = TBL_SchemaDetail.MaterialNo
WHERE TBL_SchemaDetail.SchemaNo = '7411'
AND TBL_StockMaterial.SalePrice = 0
| 維度 | ON 子句條件 | WHERE 子句條件 |
|---|---|---|
| 執行時機 | 連接階段:決定如何配對資料列 | 連接後:對結果集進行篩選 |
| 外部連接行為 | 不符合條件的右表列仍保留,左表欄位顯示 NULL | 會過濾掉左表欄位為 NULL 的列,實質轉為內部連接 |
| 語意表達 | 「如何關聯」 | 「要保留哪些結果」 |
SalePrice = 0)必須寫在 ON,否則右表無對應列會被 WHERE 過濾SchemaNo = '7411')可寫 WHERE,因左表為保留側「外連保留側篩選放 WHERE,非保留側篩選必須放 ON;內連隨意放皆同樣。」
釐清此差異,能避免外部連接查詢「莫名少資料」的經典坑,撰寫語意精確的 SQL。