你还在乱写 SQL?CTE 让你的查询干净利落!
|
admin
2025年8月30日 13:41
本文热度 156
|
什么是 CTE?
CTE 是一种临时的命名结果集,它只在当前语句的执行范围内有效。通过 WITH
关键字定义,能让查询结构更清晰,特别适合写复杂的查询或递归查询。
语法格式
WITH cte_name (column1, column2, ...)
AS
(
SELECT ...
)
SELECT *
FROM cte_name;
cte_name
:给临时结果集起名字。
(column1, column2, ...)
:可选,定义列名,列数必须与 CTE 查询结果列数一致。
CTE 内部写一个 SELECT 查询来定义结果集。
CTE 后面紧跟使用该结果集的查询语句。
例如:
1)简单的 CTE 示例 — 按销售人员和年份统计销售额
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;
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.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 让复杂查询结构更清晰、分步处理更方便。
可以定义多个 CTE 并在主查询中灵活使用。
适合分阶段处理数据,或递归查询。

系统掌握 SQL Server,从 CTE 到存储过程全都有!
阅读原文:原文链接
该文章在 2025/9/1 11:59:42 编辑过