Oracle递归查询connect by用法

针对递归查询中的connect by语法,我来为你进行详细说明。

什么是Oracle递归查询

在Oracle数据库中,递归查询是指一种以迭代的方式处理层次数据的方法。一般来说,递归查询需要使用到WITH递归子查询或connect by子句。

Oracle递归查询的两种方式

使用WITH递归子查询

WITH递归子查询语句可以将某一张表(或子查询)作为基础数据,然后使用UNION ALL关键字将这张表和选择的列作为新的子查询,再次使用UNION ALL实现递归查询。该方式适用于数据结构为树形结构的情况。

示例1:假设有一张存储公司部门员工关系的表employees,表中数据如下

Emp_Id Emp_Name Dept_Id
1 Li Lei 1
2 Han MeiMei 1
3 Xiao Ming 2
4 Zhang San 3
5 Li Si 4
6 Wang Wu 5
7 Zhou Qi 6
8 Liu Ba 4
9 Sun Jian 7

查询公司所有员工的上下级关系,并按照层级进行展示,可以使用以下SQL语句:

WITH RECURSIVE anyname AS (
        SELECT *
        FROM employees
        WHERE EMP_Id = 1      -- 顶节点, 公司CEO, 从此节点开始递归查询其下属
    UNION ALL
        SELECT e.*
        FROM employees e, anyname am
        WHERE e.Dept_Id = am.Emp_Id
    )
select * from anyname

使用connect by方法

connect by方法则使用connect by子句,在与根节点的关系成立时,自我关联操作表,则将得到的数据存储在基础虚拟表中,重复使用该方法来得到更加深入的结果。该方式适用于数据结构为分叉树形结构的情况。

示例2:假设有一张存储商品目录的表category,表中数据如下

Id Category_Name Parent_Id
1 服装 0
2 男装 1
3 女装 1
4 裤子 2
5 衬衫 2
6 外套 2
7 裙子 3
8 食品 0
9 糖果 8
10 饮料 8

查询所有商品分类的完整目录路径,可以使用以下SQL语句:

SELECT LPAD(' ', LEVEL*2-2)|| id Id, 
       LPAD(' ', LEVEL*2-2)|| Case WHEN LEVEL > 1 Then '└' else '' End||Category_NAME Category_Name
FROM category
START WITH PARENT_ID =0
CONNECT BY PRIOR Id=PARENT_ID

这里用LPAD实现了树形结构的显示效果,‘──‘和’└‘ 是两个层级之间美观的连接符。

这就是Oracle递归查询的完整攻略,希望对你有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Oracle递归查询connect by用法 - Python技术站

(1)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • MySQL数据库完全备份与增量备份详解

    MySQL数据库完全备份与增量备份详解 什么是备份 数据库备份,是指将数据库中的所有数据和对象的信息存储在另一个位置(通常是另一台计算机、存储设备或云存储上),以备不时之需的一项技术操作。数据库备份是保证数据库系统可靠性、稳定性的重要手段之一。 数据库备份的分类 数据库备份一般分为两种类型: 完全备份:对数据和数据库所有对象的备份。 增量备份:只备份增量数据…

    database 2023年5月22日
    00
  • MySQL执行事务的语法与流程详解

    MySQL 执行事务的语法与流程详解 什么是事务? 事务是指作为单一逻辑工作单元执行的操作集合,具有以下四个属性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)以及持久性(Durability)。 当进行一系列的操作时,要么全部执行成功,要么全部撤回,不能出现部分执行的情况。这就是 MySQL 所定义的事务的特性…

    database 2023年5月22日
    00
  • 一次SQL查询优化原理分析(900W+数据从17s到300ms)

    我会用Markdown格式给您讲解“一次SQL查询优化原理分析(900W+数据从17s到300ms)”的完整攻略。 一次SQL查询优化原理分析 背景 文章作者需要优化一个复杂SQL查询,该查询需要从一个含有900W+数据的大型MySQL表中检索数据,为了提高查询效率,作者不断尝试调整查询方案,最终使用了多种优化手段,将查询时间从17秒降低到了300毫秒。 分…

    database 2023年5月19日
    00
  • mysql联合索引的使用规则

    下面我将详细讲解MySQL联合索引的使用规则。 什么是MySQL联合索引? MySQL联合索引,也叫复合索引,是由多个字段组成的索引。与单列索引不同,联合索引是指同时对多个字段进行索引。联合索引可以减少查询中所需要的where条件的列索引次数,提高查询效率,在某些情况下还可以避免使用MySQL的临时表。 联合索引的使用规则 使用联合索引时需要遵循以下规则: …

    database 2023年5月22日
    00
  • GO实现Redis:GO实现Redis集群(5)

    采用一致性hash算法将key分散到不同的节点,客户端可以连接到集群中任意一个节点 https://github.com/csgopher/go-redis 本文涉及以下文件: consistenthash:实现添加和选择节点方法 standalone_database:单机database client:客户端 client_pool:实现连接池 clus…

    Redis 2023年4月10日
    00
  • Go语言的代码组织结构详细介绍

    下面是关于Go语言代码组织结构的详细介绍: 目录结构 在开始讲解代码组织结构之前,让我们先来看一下标准的Go语言项目目录结构: project-root/ |- cmd/ | |- main.go | … |- internal/ | |- config/ | | |- config.go | | … | |- pkg1/ | | |- pkg1.g…

    database 2023年5月21日
    00
  • android设备不识别awk命令 缺少busybox怎么办

    Android设备不识别awk命令 缺少Busybox解决方案 在某些情况下,我们需要在Android设备上使用awk命令进行文本处理,但是发现设备不识别awk命令,这是因为Android本身并没有集成awk命令。要使用awk命令,我们需要安装busybox工具。 什么是Busybox Busybox是一个单一可执行文件的工具箱,它包含了常用Linux命令的…

    database 2023年5月22日
    00
  • CentOS系统上安装配置Oracle数据库的详细教程

    CentOS系统上安装配置Oracle数据库的详细教程 1. 前置条件 CentOS系统(本教程基于CentOS 7) Oracle数据库zip安装文件(下载地址: https://www.oracle.com/database/technologies/oracle-database-software-downloads.html) 配置好的YUM源 2.…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部