什么是 CTE?
CTE 是一種臨時的命名結(jié)果集,它只在當(dāng)前語句的執(zhí)行范圍內(nèi)有效。通過 WITH 關(guān)鍵字定義,能讓查詢結(jié)構(gòu)更清晰,特別適合寫復(fù)雜的查詢或遞歸查詢。
語法格式
WITH cte_name (column1, column2, ...)AS( SELECT ...)SELECT *FROM cte_name;
cte_name:給臨時結(jié)果集起名字。
(column1, column2, ...):可選,定義列名,列數(shù)必須與 CTE 查詢結(jié)果列數(shù)一致。
CTE 內(nèi)部寫一個 SELECT 查詢來定義結(jié)果集。
CTE 后面緊跟使用該結(jié)果集的查詢語句。
例如:
1)簡單的 CTE 示例 — 按銷售人員和年份統(tǒng)計銷售額
WITH cte_sales_amounts (staff, sales, year) AS ( SELECT first_name + ' ' + last_name, SUM(quantity * list_price * (1 - discount)), YEAR(order_date) FROM sales.orders o INNER JOIN sales.order_items i ON i.order_id = o.order_id INNER JOIN sales.staffs s ON s.staff_id = o.staff_id GROUP BY first_name + ' ' + last_name, YEAR(order_date))SELECT staff, salesFROM cte_sales_amountsWHERE year = 2018;
定義了一個名為 cte_sales_amounts 的臨時結(jié)果集,包含銷售人員姓名、銷售額、年份三列。
CTE 查詢里統(tǒng)計了每個銷售人員每年的銷售總額。
外層查詢只取 2018 年的數(shù)據(jù)。
2)在一個查詢中使用多個 CTE,并連接它們
WITH cte_category_counts ( category_id, category_name, product_count)AS ( SELECT c.category_id, c.category_name, COUNT(p.product_id) FROM production.products p INNER JOIN production.categories c ON c.category_id = p.category_id GROUP BY c.category_id, c.category_name),cte_category_sales(category_id, sales) AS ( SELECT p.category_id, SUM(i.quantity * i.list_price * (1 - i.discount)) FROM sales.order_items i INNER JOIN production.products p ON p.product_id = i.product_id INNER JOIN sales.orders o ON o.order_id = i.order_id WHERE order_status = 4 GROUP BY p.category_id)
SELECT c.category_id, c.category_name, c.product_count, s.salesFROM cte_category_counts c INNER JOIN cte_category_sales s ON s.category_id = c.category_idORDER BY c.category_name;
cte_category_counts:統(tǒng)計每個類別的產(chǎn)品數(shù)量。
cte_category_sales:統(tǒng)計每個類別的銷售額(僅已完成訂單)。
外層查詢將兩者按類別連接,展示產(chǎn)品數(shù)和銷售額。
總結(jié)

系統(tǒng)掌握 SQL Server,從 CTE 到存儲過程全都有!
閱讀原文:原文鏈接
該文章在 2025/9/1 11:59:42 編輯過