首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL WHERE 條件與 JOIN ON 條件差異深度解析

     編輯:關於SqlServer

SQL 查詢中,篩選條件放在 WHERE 子句還是 JOIN ... ON 子句,對 外部連接 結果影響巨大。本文以 RIGHT OUTER JOIN 為例,實測兩種寫法差異。

測試場景

  • 主表:TBL_SchemaDetail(方案明細)
  • 從表:TBL_StockMaterial(物料庫存價格)
  • 關聯鍵:MaterialNo
  • 篩選條件:方案編號 SchemaNo = '7411'、售價 SalePrice = 0

寫法一:所有條件置於 ON 子句

SELECT 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

寫法二:關聯條件在 ON,篩選條件在 WHERE

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 的列,實質轉為內部連接
語意表達「如何關聯」「要保留哪些結果」

實戰建議

  • 內部連接:兩者等價,建議關聯條件寫 ON,篩選條件寫 WHERE,語意清晰
  • 左/右外部連接:
    • 右表篩選條件(如 SalePrice = 0)必須寫在 ON,否則右表無對應列會被 WHERE 過濾
    • 左表篩選條件(如 SchemaNo = '7411')可寫 WHERE,因左表為保留側
  • 完整外部連接:雙邊篩選條件皆建議寫 ON

記憶口訣

「外連保留側篩選放 WHERE,非保留側篩選必須放 ON;內連隨意放皆同樣。」

釐清此差異,能避免外部連接查詢「莫名少資料」的經典坑,撰寫語意精確的 SQL。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved