‌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。‌‌‌

相关推荐
ACP广源盛139246256737 分钟前
端侧 AI 硬件架构实践@ACP#中端边缘整机 PCIe 扩展与 IX7012 器件分析
大数据·数据库·人工智能·嵌入式硬件·开源·硬件架构
ACP广源盛139246256739 分钟前
端侧 AI 硬件架构探讨@ACP#多外设高密度整机 PCIe 扩展与 IX7024 器件分析
大数据·数据库·人工智能·嵌入式硬件·开源·硬件架构
数智启示录22 分钟前
Doris精讲篇(六) 从第一批小文件到 -235:Doris 是怎样被正常写入拖死的
大数据·数据库·经验分享·面试·flink
智购科技自动售货机工厂25 分钟前
2026自动售货机异常重启根因分析:从日志挖掘到内存取证的技术实践~YH
开发语言·数据库·单片机·嵌入式硬件·人机交互
奈斯先生Vector31 分钟前
从“能调用”到“可运营”:AI Agent 进入多模型时代后的架构升级
java·javascript·数据库·人工智能·算法·架构·aigc
whcyhhh33 分钟前
头歌实践教学平台:大数据存储2023(十四下答案)
大数据·数据库·python
Json____34 分钟前
宿舍安全卫生检查系统:Node 全栈开发实战
java·前端·数据库·毕业设计·课程设计·毕设·wwwoop.com
2601_9620715744 分钟前
基于DataX迁移MySQL到OceanBase集群
数据库·mysql·oceanbase
初願致夕霞1 小时前
五种IO模型(详解非阻塞IO与多路转接)
linux·前端·网络·数据库·tcp/ip
风哥2号1 小时前
华为高斯数据库恢复工具FGOGDU(FGEDU openGauss DUL)
数据库·opengauss·华为高斯