oracle with 递归查询

在Oracle SQL中,WITH子句(也称为公共表达式或CTE,Common Table Expressions)用于定义临时的命名结果集,这些结果集可以在主查询中引用。WITH子句可以简化复杂的SQL查询,使其更具可读性,特别是当涉及到多个子查询或递归查询时。

以下是WITH子句的基本语法:

复制代码

sql复制代码

|---|-----------------------------------------------|
| | WITH cte_name (column1, column2, ...) AS ( |
| | -- CTE的定义,通常是一个SELECT语句 |
| | ) |
| | SELECT * FROM cte_name; -- 主查询,引用CTE |

示例:使用WITH子句简化查询

假设我们有一个orders表,它包含订单信息,以及一个order_items表,它包含订单项的信息。我们想要查询每个订单的总金额。我们可以使用WITH子句来首先计算每个订单项的总金额,然后在主查询中引用这个计算结果。

复制代码

sql复制代码

|---|----------------------------------------------------------------|
| | WITH OrderSums AS ( |
| | SELECT order_id, SUM(item_price * quantity) AS total_amount |
| | FROM order_items |
| | GROUP BY order_id |
| | ) |
| | SELECT o.order_id, o.order_date, os.total_amount |
| | FROM orders o |
| | JOIN OrderSums os ON o.order_id = os.order_id; |

在这个例子中,我们定义了一个名为OrderSums的CTE,它计算了每个订单的总金额。然后,在主查询中,我们将orders表与OrderSums CTE连接起来,以获取每个订单的总金额。

递归查询中的WITH子句

WITH子句特别适用于递归查询,因为它允许你引用自身来构建层次结构或执行其他需要递归的操作。

例如,假设你有一个表示组织结构的表,其中每个员工都有一个上级。你可以使用递归的WITH子句来查找某个员工的所有下级:

复制代码

sql复制代码

|---|--------------------------------------------------------|
| | WITH RECURSIVE Subordinates AS ( |
| | -- 基础情况:直接下级 |
| | SELECT employee_id, manager_id, name |
| | FROM employees |
| | WHERE manager_id = :some_manager_id |
| | UNION ALL |
| | -- 递归情况:下级的下级 |
| | SELECT e.employee_id, e.manager_id, e.name |
| | FROM employees e |
| | JOIN Subordinates s ON e.manager_id = s.employee_id |
| | ) |
| | SELECT * FROM Subordinates; |

在这个递归查询中,我们首先定义了一个名为Subordinates的CTE,它首先选择直接属于某个特定经理的下级员工(基础情况),然后递归地选择这些下级的下级(递归情况)。通过这种方式,我们可以获取整个下级员工层次结构。

通过使用WITH子句,你可以编写更加模块化和可维护的SQL代码,特别是当处理复杂的查询逻辑时。

相关推荐
Morpheon12 小时前
SQL窗口函数中的排名函数详解:从基础到高级应用
数据库·sql·mysql
boonya12 小时前
Postgresql 如何开启矢量数据库扩展
数据库
熊文豪12 小时前
时序数据库选型指南:如何为企业选择合适的时序数据库解决方案
数据库·时序数据库·iotdb
码农学院12 小时前
MSSQL字段去掉excel复制过来的换行符
前端·数据库·sqlserver
jun~12 小时前
SQLMap数据库枚举靶机(打靶记录)
linux·数据库·笔记·学习·安全·web安全
计算机毕业设计小帅13 小时前
【2026计算机毕业设计】基于Springboot的娱乐网站设计与实现
数据库·课程设计
lang2015092813 小时前
MySQL I/O容量调优终极指南
数据库·mysql
kobe_OKOK_13 小时前
mysql 创建容器和启动远程链接
数据库·mysql
lypzcgf14 小时前
Coze源码分析-资源库-删除数据库-后端源码-安全与错误处理
数据库·安全·coze·coze源码分析·智能体平台·ai应用平台·agent平台
黄焖鸡能干四碗15 小时前
企业信息化建设总体规划设计方案
大数据·运维·数据库·人工智能·web安全