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日

相关文章

  • Linux环境下安装mysql5.7.36数据库教程

    下面是“Linux环境下安装mysql5.7.36数据库教程”的完整攻略,过程中包含两条示例说明。 准备工作 在开始安装mysql之前,需要先进行一些准备工作,包括安装依赖库、创建mysql用户等等。这些工作可以简单地通过下列命令完成: sudo apt-get update sudo apt-get install -y mysql-server mysq…

    database 2023年5月22日
    00
  • redis中使用redis-dump导出、导入、还原数据实例

    下面是使用redis-dump在Redis中导出、导入、还原数据实例的完整攻略。 1. 介绍 Redis-dump是一个开源工具,它可以用于Redis数据库的备份和还原。它将Redis数据库导出为一个格式化的JSON文件,用户可以使用此文件来还原数据库。接下来我们将使用redis-dump工具来实现Redis数据的导出、导入、还原操作。 2. 安装redis…

    database 2023年5月22日
    00
  • redis中Could not get a resource from the pool异常及解决方案

    当使用Redis作为缓存系统时,由于其高性能和高可用性,被广泛使用。但有时候,我们可能会遇到相应的异常。其中一个常见的异常是“Could not get a resource from the pool”(无法从池中获取资源)。 1. 异常原因 无法从池中获取资源的异常是由于Redis连接意外断开或者连接池中没有空闲连接。当我们在系统中频繁地连接和释放Red…

    database 2023年5月22日
    00
  • SQL实现查询某字段的值为空的记录

    要查询某个字段的值为空的记录,在 SQL 中可以使用 IS NULL 来进行。下面是 SQL 实现查询某字段的值为空的记录的攻略和示例: 基础查询语句 查询某个字段的值为空的记录,可以使用如下的 SQL 查询语句: SELECT * FROM 表名 WHERE 字段名 IS NULL; 其中,字段名代表需要查询的字段名称,表名代表需要查询的表格名称。 例如,…

    database 2023年5月21日
    00
  • navicatdesignquery.sql.bak系统找不到指定路径错误的解决方法

    当使用 Navicat 进行数据库的查询、编辑等操作时,有时会遇到 “navicatdesignquery.sql.bak系统找不到指定路径” 这样的错误提示,这种情况一般是由于 Navicat 自身或操作系统的问题所造成的,但是这并不意味着我们就无法解决这个问题。下面是解决这个问题的详细攻略: 问题原因分析: Navicat 自身问题,如升级版本或者重装 …

    database 2023年5月22日
    00
  • MongoDB服务端JavaScript脚本使用方法

    MongoDB是一种基于文档的数据库,可以使用JavaScript编写脚本进行数据的查询、更新、删除等操作。下面是MongoDB服务端JavaScript脚本使用方法的完整攻略。 1. MongoDB服务端JavaScript脚本概述 MongoDB支持在服务端使用JavaScript编写脚本来操作数据。MongoDB内置了一些使用JavaScript编写的…

    database 2023年5月21日
    00
  • Mysql中undo、redo与binlog的区别浅析

    Mysql中undo、redo与binlog的区别浅析 1. 概述 在Mysql数据库中,有三种记录业务操作的方式,它们分别是undo、redo与binlog。undo是指能够将一个事务回滚到之前的状态,redo则是指能够重新执行一个事务并将其提交,binlog则是指类似于日志的方式记录每条sql语句的操作记录。下面我们将分别对它们进行详细的介绍与比较。 2…

    database 2023年5月22日
    00
  • Redis管道技术完整攻略

    Redis管道技术是Redis提供的一种优化性能的方法,它允许我们在一次性提交多个命令,而不是一个个单独提交,可以极大地减少网络通信的开销。本文将详细讲解Redis管道技术的完整攻略,包括管道的基本原理、优缺点以及代码示例。 管道的基本原理 Redis管道的基本原理是客户端一次性将多个命令打包发送给服务端,服务端按照顺序执行这些命令,并将结果一次性返回给客户…

    Redis 2023年3月21日
    00
合作推广
合作推广
分享本页
返回顶部