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

SQL 多欄位求和作為查詢條件:子查詢 vs CTE 寫法對比

     編輯:關於SqlServer

需求:查詢 Weather 表中 redColor+greenColor+blueColor > 0 的記錄

錯誤寫法:WHERE 直接使用別名

-- 錯誤:'至少一個參數沒有被指定值'
SELECT W.ID, W.Weather, greenColor,
       (SELECT redColor+greenColor+blueColor FROM Weather N WHERE N.ID = W.ID) AS AllValue
FROM Weather W
WHERE AllValue > 0  -- 無效:WHERE 階段尚未計算 SELECT 列別名
ORDER BY ID;

原因:SQL 執行順序 FROM → WHERE → SELECT,WHERE 看不見 SELECT 的別名。

正確寫法一:WHERE 重複子查詢

SELECT W.ID, W.Weather, greenColor,
       (SELECT redColor+greenColor+blueColor FROM Weather N WHERE N.ID = W.ID) AS AllValue
FROM Weather W
WHERE (SELECT redColor+greenColor+blueColor FROM Weather N WHERE N.ID = W.ID) > 0
ORDER BY ID;
  • 優點:語法直觀
  • 缺點:子查詢執行兩次,效能較差

正確寫法二:CROSS APPLY(SQL 2005+ 推薦)

SELECT W.ID, W.Weather, W.greenColor, CA.AllValue
FROM Weather W
CROSS APPLY (
    SELECT redColor+greenColor+blueColor AS AllValue
    FROM Weather N WHERE N.ID = W.ID
) CA
WHERE CA.AllValue > 0
ORDER BY W.ID;
  • 子查詢只執行一次,結果可在 SELECT/WHERE 共用
  • 執行計畫通常優於重複子查詢

正確寫法三:CTE/衍生表預先計算

WITH Calculated AS (
    SELECT ID, Weather, greenColor,
           redColor+greenColor+blueColor AS AllValue
    FROM Weather
)
SELECT ID, Weather, greenColor, AllValue
FROM Calculated
WHERE AllValue > 0
ORDER BY ID;
  • 最清晰、最易維護
  • 可擴展多欄位計算、多條件篩選

正確寫法四:直接在 SELECT 計算(最簡潔)

SELECT ID, Weather, greenColor,
       redColor+greenColor+blueColor AS AllValue
FROM Weather
WHERE redColor+greenColor+blueColor > 0
ORDER BY ID;
  • 同一資料表無需子查詢/APPLY/CTE
  • 最佳效能,優化器可直接使用索引/統計資料

效能對比建議

寫法適用場景效能可讀性
直接計算單表、簡單運算★★★★★★★★★★
CTE複雜計算、多次引用、跨表★★★★☆★★★★★
CROSS APPLY需逐列呼叫函數/複雜邏輯★★★★☆★★★★☆
重複子查詢快速原型、一次性查詢★★☆☆☆★★★☆☆

核心原則

  1. WHERE 不能使用 SELECT 列別名
  2. 優先將計算下推到 FROM/CTE/APPLY,避免重複計算
  3. 單表簡單運算直接寫在 WHERE/SELECT 最佳
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved