‌Oracle CTE(公共表表达式)

‌Oracle CTE(公共表表达式)是用 WITH 关键字定义的临时结果集,只在当前 SQL 语句中生效,可简化复杂查询和实现递归查询‌。‌‌‌

基本语法

‌标准 CTE 结构‌:用 WITH 开头定义临时表名,AS 后面跟查询语句,主查询直接引用该表名。

格式:WITH 表名 AS (SELECT 语句) SELECT * FROM 表名

临时表只在当前 SQL 执行时存在,执行完自动消失。

可定义多个 CTE,用逗号分隔。‌‌‌

‌优势‌:把嵌套子查询拆成线性逻辑,代码更好读好维护。

避免重复写相同子查询,提升复用性。

复杂报表可拆成多个有业务语义的小模块。

替代临时视图,不需要永久存储时使用。‌‌‌

递归查询

‌递归 CTE 结构‌:由锚成员(初始查询)和递归成员两部分组成,用 UNION ALL 连接。

锚成员:先执行,查出顶级节点或种子数据。

递归成员:引用 CTE 自身,基于前一次结果继续查询。

终止条件:递归部分不再产生新行时自动停止。‌‌‌

‌典型应用场景‌:处理树形或层次结构数据。

‌组织架构查询‌:查某个员工的所有下属,包括间接下属。

‌目录树遍历‌:产品分类、菜单层级等。

‌序列生成‌:生成日期序列、数字序列。

示例:生成 1 到 10 的整数序列 WITH t1(n) AS (SELECT 1 FROM dual UNION ALL SELECT n+1 FROM t1 WHERE n<10) SELECT * FROM t1‌‌‌

‌注意事项‌:递归 CTE 必须包含明确终止条件,否则可能无限循环。

处理大量数据时可能影响性能,需合理使用索引。

Oracle 从 11g R2 版本开始支持递归 CTE。‌‌‌

和 CONNECT BY 有啥区别

‌CTE 特点‌:更符合 SQL 标准,跨数据库兼容性好。

支持更复杂的递归逻辑,如条件过滤、聚合计算。

可在递归过程中使用聚合函数(SUM、COUNT 等)。

适合跨数据库开发,保证代码兼容性。‌‌‌

‌CONNECT BY 特点‌:Oracle 专有语法,不具备跨数据库移植性。

语法更简洁,用 START WITH 和 CONNECT BY 子句。

可通过 LEVEL 伪列直接获取节点深度。

支持 SYS_CONNECT_BY_PATH 函数直接生成节点路径。

对大规模层级数据可能性能更好。‌‌‌

‌选择建议‌:需要跨数据库兼容或复杂递归逻辑时用 CTE,纯 Oracle 环境且简单层级查询可用 CONNECT BY。‌‌‌

相关推荐
+VX:Fegn08952 小时前
计算机毕业设计|基于java+ vue共享单车信息系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
mysqloffice2 小时前
数智时代,核心系统数据库架构往哪走
数据库·人工智能
l1t2 小时前
DeepSeek总结的 pgColumnar 1.0-alpha4 发布说明
数据库·postgresql
DBA_G3 小时前
南大通用GBase 8s数据库助力某农商行核心系统投产
数据库
工业涂料百问3 小时前
【环保合规】系列(四)工业涂料碳足迹怎么算?边界定义、因子选择与减排优先级拆解
数据库
wuyk5554 小时前
【Socket 进阶之路】第 7 章 IO 多路复用 select & poll 完整实战|多 fd 监听、超时等待、优缺点横向对比
服务器·开发语言·网络·数据库·物联网
文人sec4 小时前
grant 之后要跟着 flush privileges 吗?要不要使用分区表?
数据库·mysql·adb·数据分析
Omics Pro4 小时前
上海AI Lab孙思琦×高张阳:虚拟细胞代码库智能体
数据库·人工智能·算法·机器学习·自然语言处理
点纭5 小时前
C 语言 第七章 常用函数(3)
c语言·开发语言·算法·oracle·c#
旺仔不是程序员5 小时前
相关子查询与性能优化:PostgreSQL 逐行执行的代价与 JOIN 重写
数据库·后端·sql