2025-12-22 公共表達(dá)式CTE

MS SQL Server 中,WITH Deviation AS (...) 這種寫法屬于 CTE(Common Table Expression,公共表表達(dá)式)
CTE 并不只有你看到的這一種“形式”,而是可以按 用途和能力 分成幾類。下面我系統(tǒng)地給你梳理一下 ??
(偏工程實(shí)戰(zhàn) + 易理解,適合你平時(shí)寫測(cè)試/分析 SQL)


一、CTE 的本質(zhì)(一句話理解)

CTE = 給一段子查詢起一個(gè)“臨時(shí)名字”,只在當(dāng)前 SQL 語句中有效

WITH CTE名 AS (
    SELECT ...
)
SELECT * FROM CTE名;
  • 不是表
  • 不是視圖
  • 不會(huì)落盤
  • 作用域只在 當(dāng)前語句

二、CTE 的幾種“常見類型 / 用法分類”

SQL 語法只有一種 WITH,但“用途”不同


1?? 普通(非遞歸)CTE —— 最常見 ?

?? 用來替代復(fù)雜子查詢,提高可讀性

示例

WITH Deviation AS (
    SELECT
        SN,
        Power - AvgPower AS Dev
    FROM TestData
)
SELECT *
FROM Deviation
WHERE ABS(Dev) > 1;

使用場(chǎng)景

  • 復(fù)雜 SELECT
  • 多層子查詢
  • 臨時(shí)計(jì)算中間結(jié)果

?? 這是你現(xiàn)在用的這一類


2?? 多 CTE(鏈?zhǔn)?CTE)—— 一個(gè)接一個(gè)

?? 一個(gè) CTE 依賴另一個(gè) CTE

示例

WITH RawData AS (
    SELECT SN, Power
    FROM TestData
),
Deviation AS (
    SELECT
        SN,
        Power - AVG(Power) OVER() AS Dev
    FROM RawData
)
SELECT *
FROM Deviation;

特點(diǎn)

  • 像“流水線”
  • 邏輯拆得非常清楚
  • 強(qiáng)烈推薦在復(fù)雜分析 SQL 中使用

3?? 遞歸 CTE(Recursive CTE)??

?? SQL Server 中最“高級(jí)”的 CTE

典型用途

  • 樹結(jié)構(gòu)
  • 層級(jí)關(guān)系
  • 步進(jìn) / 迭代計(jì)算

示例 1:遞歸生成數(shù)字

WITH NumCTE AS (
    SELECT 1 AS N
    UNION ALL
    SELECT N + 1
    FROM NumCTE
    WHERE N < 10
)
SELECT * FROM NumCTE;

?? SQL 里沒有 for 循環(huán)?遞歸 CTE 就是


示例 2:層級(jí)結(jié)構(gòu)(父子關(guān)系)

WITH OrgCTE AS (
    SELECT ID, ParentID, Name, 0 AS Level
    FROM Org
    WHERE ParentID IS NULL

    UNION ALL

    SELECT o.ID, o.ParentID, o.Name, c.Level + 1
    FROM Org o
    JOIN OrgCTE c ON o.ParentID = c.ID
)
SELECT * FROM OrgCTE;

4?? 用 CTE 做 UPDATE / DELETE / INSERT

?? CTE 不只是 SELECT


UPDATE + CTE

WITH BadData AS (
    SELECT *
    FROM TestData
    WHERE Power > 10
)
UPDATE BadData
SET Power = 10;

DELETE + CTE

WITH DupSN AS (
    SELECT SN
    FROM TestData
    GROUP BY SN
    HAVING COUNT(*) > 1
)
DELETE FROM TestData
WHERE SN IN (SELECT SN FROM DupSN);

?? 在清理測(cè)試數(shù)據(jù)時(shí)非常實(shí)用


5?? CTE + 窗口函數(shù)(工程最常見組合)?

?? 你在光模塊測(cè)試數(shù)據(jù)分析里會(huì)經(jīng)常用

WITH Stat AS (
    SELECT
        SN,
        Power,
        AVG(Power) OVER(PARTITION BY SN) AS AvgPower,
        STDEV(Power) OVER(PARTITION BY SN) AS StdDev
    FROM TestData
)
SELECT *
FROM Stat
WHERE ABS(Power - AvgPower) > 3 * StdDev;

??

  • 比子查詢清晰
  • 比臨時(shí)表輕量

三、CTE 和其他“表表達(dá)式”的關(guān)系(重點(diǎn))

SQL Server 中的 表表達(dá)式家族

類型 是否可復(fù)用 是否落盤 作用域
子查詢 ? ? 局部
CTE ? ? 當(dāng)前語句
臨時(shí)表 #temp ? ? 會(huì)話
表變量 @t 部分 內(nèi)存 批處理
視圖 ? ? 全局

?? CTE ≈ “一次性視圖”


四、CTE 使用中的幾個(gè)“坑”(很重要)

? 1. CTE 不能跨語句使用

WITH A AS (...)
SELECT * FROM A;

SELECT * FROM A; -- ? 不行

? 2. CTE 默認(rèn)不保證執(zhí)行順序

  • SQL Server 會(huì)自動(dòng)優(yōu)化
  • 不要指望 CTE 像臨時(shí)表一樣“先算完”

? 3. 遞歸 CTE 有默認(rèn)深度限制

OPTION (MAXRECURSION 1000);

五、你在“測(cè)試數(shù)據(jù)分析”里最值得用的 CTE 場(chǎng)景

結(jié)合你現(xiàn)在的工作(光模塊 / RF / 測(cè)試數(shù)據(jù)):

? Deviation / 統(tǒng)計(jì)分析
? 多步測(cè)試結(jié)果拆分
? 異常點(diǎn)篩選
? SN / Lot / Step 分層分析
? 替代 VB / C# 里的中間計(jì)算


六、總結(jié)一句話(給你記憶用)

CTE 只有一種語法,但至少有 5 種工程級(jí)用法

1?? 普通 CTE
2?? 多 CTE 鏈?zhǔn)?br> 3?? 遞歸 CTE
4?? CTE + DML(Update/Delete)
5?? CTE + 窗口函數(shù)


如果你愿意,下一步我可以幫你:

  • ?? 把 你現(xiàn)有的某個(gè) SQL(Deviation 相關(guān))重構(gòu)成 CTE
  • ?? 對(duì)比 CTE vs 臨時(shí)表 在測(cè)試數(shù)據(jù)分析中的性能
  • ?? 給你一套 “測(cè)試數(shù)據(jù)分析專用 CTE 模板”

你更想看哪一個(gè)?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容