什么是 CTE?
CTE 是一種臨時(shí)的命名結(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
:給臨時(shí)結(jié)果集起名字。
(column1, column2, ...)
:可選,定義列名,列數(shù)必須與 CTE 查詢結(jié)果列數(shù)一致。
CTE 內(nèi)部寫一個(gè) SELECT 查詢來定義結(jié)果集。
CTE 后面緊跟使用該結(jié)果集的查詢語句。
例如:
1)簡單的 CTE 示例 — 按銷售人員和年份統(tǒng)計(jì)銷售額
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,
sales
FROM
cte_sales_amounts
WHERE
year = 2018;
定義了一個(gè)名為 cte_sales_amounts
的臨時(shí)結(jié)果集,包含銷售人員姓名、銷售額、年份三列。
CTE 查詢里統(tǒng)計(jì)了每個(gè)銷售人員每年的銷售總額。
外層查詢只取 2018 年的數(shù)據(jù)。
2)在一個(gè)查詢中使用多個(gè) 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.sales
FROM
cte_category_counts c
INNER JOIN cte_category_sales s ON s.category_id = c.category_id
ORDER BY
c.category_name;
cte_category_counts
:統(tǒng)計(jì)每個(gè)類別的產(chǎn)品數(shù)量。
cte_category_sales
:統(tǒng)計(jì)每個(gè)類別的銷售額(僅已完成訂單)。
外層查詢將兩者按類別連接,展示產(chǎn)品數(shù)和銷售額。
總結(jié)
CTE 讓復(fù)雜查詢結(jié)構(gòu)更清晰、分步處理更方便。
可以定義多個(gè) CTE 并在主查詢中靈活使用。
適合分階段處理數(shù)據(jù),或遞歸查詢。

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