LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

你还在乱写 SQL?CTE 让你的查询干净利落!

admin
2025年8月30日 13:41 本文热度 156

什么是 CTE?

CTE 是一种临时的命名结果集,它只在当前语句的执行范围内有效。通过 WITH 关键字定义,能让查询结构更清晰,特别适合写复杂的查询或递归查询。

语法格式

WITH cte_name (column1, column2, ...)AS(    -- 定义CTE的查询    SELECT ...)-- 使用CTESELECT *FROM cte_name;

  • cte_name:给临时结果集起名字。

  • (column1, column2, ...):可选,定义列名,列数必须与 CTE 查询结果列数一致。

  • CTE 内部写一个 SELECT 查询来定义结果集。

  • CTE 后面紧跟使用该结果集的查询语句。

例如:

1)简单的 CTE 示例 — 按销售人员和年份统计销售额

WITH cte_sales_amounts (staff, sales, yearAS (    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 的临时结果集,包含销售人员姓名、销售额、年份三列。

  • CTE 查询里统计了每个销售人员每年的销售总额。

  • 外层查询只取 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_category_counts:统计每个类别的产品数量。

  • cte_category_sales:统计每个类别的销售额(仅已完成订单)。

  • 外层查询将两者按类别连接,展示产品数和销售额。

总结

  • CTE 让复杂查询结构更清晰、分步处理更方便。

  • 可以定义多个 CTE 并在主查询中灵活使用。

  • 适合分阶段处理数据,或递归查询。

  系统掌握 SQL Server,从 CTE 到存储过程全都有!


阅读原文:原文链接


该文章在 2025/9/1 11:59:42 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved