当前位置: 首页 > news >正文

sql语言之cte语法

WITH TableData AS使用的是CTE(Common Table Expressions,公共表表达式)语法,也称为"子查询因子化"或"WITH子句"。这是SQL标准的一部分,在很多主流数据库中都支持。

1. CTE基本语法

WITH cte_name (column1, column2, ...) AS ( -- 子查询定义 SELECT ... ) -- 主查询 SELECT * FROM cte_name;

2. 你的查询中CTE的结构

WITH TableData AS ( -- 第一个CTE:获取表的基本信息和字段信息 SELECT ... ), PrimaryKeys AS ( -- 第二个CTE:获取主键信息(可以定义多个CTE) SELECT ... ) -- 主查询,可以使用上面定义的所有CTE SELECT ... FROM ...

3. CTE的主要特点

优点:

  1. 可读性好:将复杂查询分解为多个逻辑部分

  2. 可重用:在主查询中可以多次引用同一个CTE

  3. 支持递归:实现递归查询(如树形结构查询)

在你的查询中的应用:

-- 第一部分:定义TableData CTE WITH TableData AS ( SELECT t.TABLE_NAME, tc.COMMENTS, c.COLUMN_NAME, ... FROM DBA_TABLES t JOIN ... -- 复杂的多表连接和计算 ), -- 第二部分:定义PrimaryKeys CTE(虽然你定义了但后面没使用) PrimaryKeys AS ( SELECT ... ) -- 第三部分:主查询,基于TableData进行进一步处理 SELECT ... FROM ( -- 使用UNION ALL组合多种类型的数据行 SELECT 0 AS GROUP_ID, ... FROM TableData UNION ALL SELECT 1 AS GROUP_ID, ... FROM TableData UNION ALL SELECT 2 AS GROUP_ID, ... FROM TableData UNION ALL SELECT 3 AS GROUP_ID, ... FROM TableData ) Combined ORDER BY ...;

4. 等价的传统写法(不使用CTE)

-- 不使用CTE,需要嵌套子查询 SELECT CASE WHEN GROUP_ID = 0 THEN '【表】' || TABLE_NAME || ... ELSE '' END AS 表信息, ... FROM ( -- 表头行 SELECT 0 AS GROUP_ID, TABLE_NAME, TABLE_COMMENT, ... FROM ( -- 重复TableData的逻辑 SELECT DISTINCT t.TABLE_NAME, tc.COMMENTS AS TABLE_COMMENT FROM DBA_TABLES t LEFT JOIN DBA_TAB_COMMENTS tc ON ... LEFT JOIN DBA_TAB_COLUMNS c ON ... WHERE t.OWNER = 'CIRCLE' ) distinct_tables UNION ALL -- 字段标题行(也需要重复TableData的逻辑) SELECT 1 AS GROUP_ID, TABLE_NAME, TABLE_COMMENT, ... FROM ( SELECT DISTINCT t.TABLE_NAME, tc.COMMENTS AS TABLE_COMMENT FROM DBA_TABLES t LEFT JOIN DBA_TAB_COMMENTS tc ON ... LEFT JOIN DBA_TAB_COLUMNS c ON ... WHERE t.OWNER = 'CIRCLE' ) distinct_tables UNION ALL -- 字段数据行(完整重复TableData逻辑) SELECT 2 AS GROUP_ID, TABLE_NAME, TABLE_COMMENT, COLUMN_NAME, DATA_TYPE, ... FROM ( -- 这是TableData的完整内容,需要在这里重复写一遍 SELECT t.TABLE_NAME, tc.COMMENTS AS TABLE_COMMENT, c.COLUMN_NAME, c.DATA_TYPE, ... FROM DBA_TABLES t LEFT JOIN DBA_TAB_COMMENTS tc ON ... LEFT JOIN DBA_TAB_COLUMNS c ON ... LEFT JOIN DBA_COL_COMMENTS cc ON ... WHERE t.OWNER = 'CIRCLE' ) table_data UNION ALL -- 空行分隔(也需要重复) SELECT 3 AS GROUP_ID, TABLE_NAME, TABLE_COMMENT, ... FROM ( SELECT DISTINCT t.TABLE_NAME, tc.COMMENTS AS TABLE_COMMENT FROM DBA_TABLES t LEFT JOIN DBA_TAB_COMMENTS tc ON ... LEFT JOIN DBA_TAB_COLUMNS c ON ... WHERE t.OWNER = 'CIRCLE' ) distinct_tables ) Combined ORDER BY ...;

5. CTE在不同数据库中的支持情况

数据库支持情况备注
Oracle✅ 支持Oracle 9i及以上
SQL Server✅ 支持SQL Server 2005及以上
PostgreSQL✅ 支持
MySQL✅ 支持MySQL 8.0及以上
达梦数据库✅ 支持达梦支持CTE语法
SQLite✅ 支持SQLite 3.8.3及以上

6. CTE的实用示例

示例1:简单的CTE

-- 查询部门平均工资高于公司平均工资的部门 WITH DeptAvg AS ( SELECT dept_id, AVG(salary) as avg_salary FROM employees GROUP BY dept_id ), CompanyAvg AS ( SELECT AVG(salary) as company_avg FROM employees ) SELECT d.dept_id, d.avg_salary, c.company_avg FROM DeptAvg d, CompanyAvg c WHERE d.avg_salary > c.company_avg;

示例2:递归CTE(查询树形结构)

-- 查询组织架构树 WITH RECURSIVE OrgTree AS ( -- 初始查询:根节点 SELECT id, name, parent_id, 1 as level FROM organization WHERE parent_id IS NULL UNION ALL -- 递归查询:子节点 SELECT o.id, o.name, o.parent_id, ot.level + 1 FROM organization o INNER JOIN OrgTree ot ON o.parent_id = ot.id ) SELECT * FROM OrgTree ORDER BY level, id;

7. 在你的场景中的好处

使用CTE让你的查询:

  1. 更清晰:将数据准备逻辑(TableData)与展示逻辑分离

  2. 更易维护:如果需要修改数据获取逻辑,只需修改CTE部分

  3. 性能可能更好:数据库优化器可以更好地优化CTE

8. 注意事项

  1. CTE只在当前查询中有效:CTE定义的作用域仅限于当前查询

  2. 可以引用前面的CTE:后面的CTE可以引用前面定义的CTE

  3. 不能嵌套:不能在CTE内部再定义CTE

  4. 分号位置:CTE定义结束后,主查询前不需要分号

你的查询使用了CTE来构建一个"表格化"的表结构输出,这是一种很好的实践,特别是当需要生成包含表头、标题行、数据行和分隔行的完整报表时。

http://www.jsqmd.com/news/316841/

相关文章:

  • 国产破局・焊领未来|2026 激光焊接机核心供应商解析
  • 2026化工行业废水处理工程诚信厂家推荐榜
  • 2026年全国设备搬运厂家权威榜单 大型项目实施与定制化服务解析
  • AI 开发者需要什么样的数据库
  • 5555555555
  • 777777777
  • 从知识图谱到 GraphRAG:探索属性图的构建和复杂的数据检索实践
  • 【瑞芯微平台实时Linux方案系列】第七篇 - 瑞芯微平台实时Linux远程调试与运维方案
  • 什么是CSRF?CSRF漏洞原理攻击与防御(非常详细)从零基础入门到精通,收藏这一篇就够了!
  • Nodejs+vue智能管理的企业员工打卡签到办公系统app小程序
  • Nodejs+vue校园失物招领小程序的设计与实现
  • Nodejs+vue职业技术课程在线培训考试系统App小程序
  • Nodejs+vue智慧读书俱乐部在线阅读打卡系统的设计与实现app小程序
  • 堆垛机控制系统货叉运动控制 FC16功能块实现
  • 2026年法式家具终极选型指南:TOP5品牌雕花漆感与整案交付深度测评
  • 行业内口碑好的沙发厂家排行榜单及宜昌银创精品新旧交易市场沙发解决方案,厨房设备/酒店设备/餐饮设备,沙发直销厂家哪个好
  • 使用腾讯云免费轻量云服务器搭建一个 clawdbot (Moltbot) 服务
  • 深入解析:go进阶语法
  • 2026年垃圾压缩机厂家权威推荐榜:水平地埋式垃圾压缩机/移动一体式垃圾压缩机/三缸四柱直压式垃圾压缩机/垃圾压缩机安装/选择指南
  • 细聊驰创轴承评价如何,听听用户的真实声音
  • 前端倒计时活动,为什么不推荐直接用 setTimeout / setInterval?
  • 一张图看懂产品热设计全流程:从需求到验证的关键步骤与角色协作
  • 2026年福州靠谱阀门厂家排名,永园阀门名列前茅
  • 看懂风扇的“里外”:原理、构造、性能与计算的系统性解读
  • 聊聊智能型高压预付费装置供应商,哪家性价比高看这里
  • 2026年动物油设备排名,看看宏九动物油设备品牌在市场的影响力
  • 涛思数据库-数据源配置
  • 2026常州市英语雅思培训机构推荐,权威英语雅思课程学校排行榜
  • 2026年工业用彩漂液厂家五大年度榜:主打液体彩漂 粉体彩漂 彩漂液 彩漂粉 水洗厂彩漂液 洗涤剂彩漂液 主洗剂彩漂液 低温彩漂粉 速溶高效彩漂粉 27.5%彩漂液 35%彩漂液
  • 2026年正规垃圾压缩机优质公司推荐