你还在乱写 SQL?CTE 让你的查询干净利落!
				
									
					
					
						|  | 
							admin 2025年8月30日 13:41
								本文热度 871 | 
					
				 
				什么是 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 编辑过