你还在乱写 SQL?CTE 让你的查询干净利落!
|
admin
2025年8月30日 13:41
本文热度 821
|
什么是 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, salesFROM cte_sales_amountsWHERE 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.salesFROM cte_category_counts c INNER JOIN cte_category_sales s ON s.category_id = c.category_idORDER BY c.category_name;
总结
CTE 让复杂查询结构更清晰、分步处理更方便。
可以定义多个 CTE 并在主查询中灵活使用。
适合分阶段处理数据,或递归查询。

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