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

相关推荐
hz567899 分钟前
涉密视频会议设备配置指南:终端、音视频采集与配套设施选型
服务器·网络·数据库·安全·实时音视频·信息与通信·智能硬件
广州浮点FLOATLIC15 分钟前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
程序员Sunday17 分钟前
MySQL 为什么使用 B+ 树索引?把范围查询、回表和覆盖索引连起来
数据库·mysql
半杯咖啡半行码38 分钟前
Qt开发实战:数据库、MV 模式、QProcess与串口通信全攻略
数据库·qt
小米里的大麦1 小时前
16 MySQL 事务
数据库·mysql
西柚小萌新1 小时前
【LLM&&AI应用开发 八股文】--4.3.Agent智能体(下)
java·开发语言·数据库
邓工说电2 小时前
智慧断路器安全吗?数据加密、离线保护与合规认证全解读
大数据·数据库·人工智能·智能断路器·炜晔科技
adinnet20262 小时前
企业微调大模型(Fine-tuning):先吃透 RAG 还是先训自己的模型
大数据·数据库
上位机妹子3 小时前
EF Core 两种继承映射:每层次一张表(TPH)与每类型一张表(TPT)
数据库·c#·.netcore·ef core
小马同学-3 小时前
Redis消息队列与客户端编程
数据库·redis