Oracle WITH 子句(也称为 公共表表达式,Common Table Expression,CTE)

在 Oracle 中,WITH 子句(也称为 公共表表达式,Common Table Expression,CTE)用于定义一个临时的命名子查询,可以在后续的 SQL 语句中多次引用。它提高了复杂查询的可读性和可维护性,尤其适合需要多次使用同一子查询或递归查询的场景。

基础语法

WITH

cte_name (column1, column2, ...) AS (

SELECT ... -- 定义临时结果集

)

SELECT ... -- 主查询(可引用CTE)

常见用途

1. 简化复杂子查询

WITH sales_summary AS (

SELECT

product_id,

SUM(amount) AS total_sales

FROM sales

GROUP BY product_id

)

SELECT

p.product_name,

s.total_sales

FROM products p

JOIN sales_summary s ON p.product_id = s.product_id;

2. 递归查询(树形结构或层次数据)

WITH employee_hierarchy (employee_id, name, manager_id, level) AS (

-- 初始查询(根节点)

SELECT

employee_id,

name,

manager_id,

1 AS level

FROM employees

WHERE manager_id IS NULL

UNION ALL

-- 递归部分

SELECT

e.employee_id,

e.name,

e.manager_id,

eh.level + 1

FROM employees e

JOIN employee_hierarchy eh ON e.manager_id = eh.employee_id

)

SELECT * FROM employee_hierarchy;

3. 组合多个CTE

WITH

cte1 AS (SELECT ... FROM table1),

cte2 AS (SELECT ... FROM table2)

SELECT

cte1.col1,

cte2.col2

FROM cte1

JOIN cte2 ON cte1.id = cte2.id;

通过 WITH 子句,可以显著提升复杂查询的结构化程度,尤其在处理多层次逻辑或递归数据时非常高效。

相关推荐
一 乐2 小时前
婚纱摄影网站|基于ssm + vue婚纱摄影网站系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端
1.14(java)3 小时前
SQL数据库操作:从CRUD到高级查询
数据库
Full Stack Developme4 小时前
数据库索引的原理及类型和应用场景
数据库
IDC02_FEIYA5 小时前
SQL Server 2025数据库安装图文教程(附SQL Server2025数据库下载安装包)
数据库·windows
辞砚技术录5 小时前
MySQL面试题——联合索引
数据库·面试
萧曵 丶6 小时前
MySQL 主键不推荐使用 UUID 的深层原因
数据库·mysql·索引
小北方城市网6 小时前
分布式锁实战指南:从选型到落地,避开 90% 的坑
java·数据库·redis·分布式·python·缓存
毕设十刻6 小时前
基于Vue的人事管理系统67zzz(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
TDengine (老段)8 小时前
TDengine Python 连接器入门指南
大数据·数据库·python·物联网·时序数据库·tdengine·涛思数据
萧曵 丶8 小时前
事务ACID特性详解
数据库·事务·acid