oracle递归查询connect by prior

这篇具有很好参考价值的文章主要介绍了oracle递归查询connect by prior。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

递归查询connect by prior

1、测试环境

数据库表结构如下:

create table menu_prior( root_id number, id number, name varchar(20),
description varchar(20) );
插入数据

insert into menu_prior(root_id,id,name,description) values(0,100,'1menu','main menu');
insert into menu_prior(root_id,id,name,description) values(100,101,'1-1menu','1 level menu');
insert into menu_prior(root_id,id,name,description) values(100,102,'1-2menu','1 level menu');
insert into menu_prior(root_id,id,name,description) values(102,1021,'1-2-1menu','2 level menu');
insert into menu_prior(root_id,id,name,description) values(102,1022,'1-2-2menu','2 level menu');

insert into menu_prior(root_id,id,name,description) values(0,200,'2menu','main menu');
insert into menu_prior(root_id,id,name,description) values(200,201,'2-1menu','1 level menu');
insert into menu_prior(root_id,id,name,description) values(200,202,'2-2menu','1 level menu');
insert into menu_prior(root_id,id,name,description) values(202,2021,'2-1-1menu','2 level menu');
insert into menu_prior(root_id,id,name,description) values(202,2022,'2-1-2menu','2 level menu');

2、基本查询

(1)获取完整树:
 select * from menu_prior; 
SQL>   select * from menu_prior start with root_id = 0 connect by prior id = root_id;
    ROOT_ID         ID NAME                 DESCRIPTION
---------- ---------- -------------------- --------------------
         0        100 1menu                main menu
       100        101 1-1menu              1 level menu
       100        102 1-2menu              1 level menu
       102       1021 1-2-1menu            2 level menu
       102       1022 1-2-2menu            2 level menu
         0        200 2menu                main menu
       200        201 2-1menu              1 level menu
       200        202 2-2menu              1 level menu
       202       2021 2-1-1menu            2 level menu
       202       2022 2-1-2menu            2 level menu

10 rows selected

(2)获取特定子树:
select * from menu_prior start with id = 100 connect by prior id = root_id;
SQL> select * from menu_prior start with id = 100 connect by prior id = root_id;

   ROOT_ID         ID NAME                 DESCRIPTION
---------- ---------- -------------------- --------------------
         0        100 1menu                main menu
       100        101 1-1menu              1 level menu
       100        102 1-2menu              1 level menu
       102       1021 1-2-1menu            2 level menu
       102       1022 1-2-2menu            2 level menu

select * from menu_prior start with id = 200 connect by prior id = root_id;
SQL> select * from menu_prior start with id = 200 connect by prior id = root_id;

   ROOT_ID         ID NAME                 DESCRIPTION
---------- ---------- -------------------- --------------------
         0        200 2menu                main menu
       200        201 2-1menu              1 level menu
       200        202 2-2menu              1 level menu
       202       2021 2-1-1menu            2 level menu
       202       2022 2-1-2menu            2 level menu

select * from menu_prior start with id = 200 connect by root_id = id;
SQL> select * from menu_prior start with id = 200 connect by root_id = id;

   ROOT_ID         ID NAME                 DESCRIPTION
---------- ---------- -------------------- --------------------
         0        200 2menu                main menu
(3)不做深层递归

如果connect by prior中的prior被省略,则查询将不进行深层递归。
如:

select * from menu_prior start with root_id = 0 connect by id = root_id;
SQL> select * from menu_prior start with root_id = 0 connect by id = root_id;

   ROOT_ID         ID NAME                 DESCRIPTION
---------- ---------- -------------------- --------------------
         0        100 1menu                main menu
         0        200 2menu                main menu

select * from menu_prior start with id = 100 connect by id = root_id;
SQL> select * from menu_prior start with id = 100 connect by id = root_id;

   ROOT_ID         ID NAME                 DESCRIPTION
---------- ---------- -------------------- --------------------
         0        100 1menu                main menu

3、递归查询分类

oracle的start with connect by prior是根据条件递归查询"树",分为四种使用情况:

第一种:start with 子节点ID=’…’ connect by prior 子节点ID = 父节点ID

查询结果是:自己所有的后代节点(包括自己)

select * from menu_prior  m start with m.root_id=100 connect by prior m.id=m.root_id;
SQL> select * from menu_prior  m start with m.root_id=100 connect by prior m.id=m.root_id;

   ROOT_ID         ID NAME                 DESCRIPTION
---------- ---------- -------------------- --------------------
       100        101 1-1menu              1 level menu
       100        102 1-2menu              1 level menu
       102       1021 1-2-1menu            2 level menu
       102       1022 1-2-2menu            2 level menu
第二种:start with 子节点ID=’…’ connect by prior 父节点ID =子节点ID

查询结果是:自己所有的前代节点(包括自己)

select * from menu_prior  m start with m.id=1022 connect by prior m.root_id=m.id;
SQL> select * from menu_prior  m start with m.id=1022 connect by prior m.root_id=m.id;

   ROOT_ID         ID NAME                 DESCRIPTION
---------- ---------- -------------------- --------------------
       102       1022 1-2-2menu            2 level menu
       100        102 1-2menu              1 level menu
         0        100 1menu                main menu
第三种:start with 父节点ID=’…’ connect by prior 子节点ID = 父节点ID

查询结果是:自己所有的后代节点(不包括自己)。

select * from menu_prior  m start with m.root_id=102 connect by prior m.id=m.root_id;
SQL> select * from menu_prior  m start with m.root_id=102 connect by prior m.id=m.root_id;

   ROOT_ID         ID NAME                 DESCRIPTION
---------- ---------- -------------------- --------------------
       102       1021 1-2-1menu            2 level menu
       102       1022 1-2-2menu            2 level menu

第四种:start with 父节点ID=’…’ connect by 父节点ID = prior 子节点ID

查询结果是:自己的第一代后节点和所有的前代节点(包括自己)。

select * from menu_prior  m start with m.root_id=102 connect by prior m.root_id=m.id;
SQL> select * from menu_prior  m start with m.root_id=102 connect by prior m.root_id=m.id;

   ROOT_ID         ID NAME                 DESCRIPTION
---------- ---------- -------------------- --------------------
       102       1021 1-2-1menu            2 level menu
       100        102 1-2menu              1 level menu
         0        100 1menu                main menu
       102       1022 1-2-2menu            2 level menu
       100        102 1-2menu              1 level menu
         0        100 1menu                main menu

4、总结:

1、start with id= 是定义起始节点(种子),可以是id也可以是root_id,定义为root_Id查询该节点下所有的树结构,定义为id(子节点)则查询指定的树。
2、connect by prior :prior的含义为先前,前一条记录。prior id=root_id 也就是前一条记录的id等于当前记录的root_id(父id)。
3、可以向下或者向上查找,父节点在前,向前查找;父节点在后,向后查找。
4、level字段为oracle特有的层级字段,可以通过level字段查询指定的层级。文章来源地址https://www.toymoban.com/news/detail-766462.html

select root_id,id,name,level from menu_prior where level=1  start with root_id = 0 connect by prior id = root_id;
SQL> select root_id,id,name,level from menu_prior where level=1
  2   start with root_id = 0
  3  connect by prior id = root_id;

   ROOT_ID         ID NAME                      LEVEL
---------- ---------- -------------------- ----------
         0        100 1menu                         1
         0        200 2menu                         1

--使用level控制层级:
select root_id,id,name,level from menu_prior where level=2 start with root_id = 0 connect by prior id = root_id;

SQL> select root_id,id,name,level from menu_prior where level=2
  2   start with root_id = 0
  3  connect by prior id = root_id;

   ROOT_ID         ID NAME                      LEVEL
---------- ---------- -------------------- ----------
       100        101 1-1menu                       2
       100        102 1-2menu                       2
       200        201 2-1menu                       2
       200        202 2-2menu                       2

到了这里,关于oracle递归查询connect by prior的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • oracle 12 查询数据库锁

    在Oracle 12c中,查询数据库锁信息可以通过以下视图进行: v$locked_object :这个视图显示了当前被锁定的对象(如表、行等)的信息。 v s e s s i o n ∗ ∗ 和 ∗ ∗ v session** 和 **v sess i o n ∗ ∗ 和 ∗ ∗ v lock :这两个视图提供了关于会话和锁的详细信息,可以结合使用以获取更

    2024年01月25日
    浏览(39)
  • 查询数据库空间(mysql和oracle)

    1.查看数据库表空间文件: 2.查看所有表空间的总容量: 3.查看数据库表空间使用率 4.1.查看表空间总大小、使用率、剩余空间 4.2.查看表空间使用率(包含temp临时表空间) 5.查看具体表的占用空间大小 1.更改表空间的dbf数据文件分配空间大小 2. 为表空间新增一个数据文件(表空间

    2024年02月05日
    浏览(35)
  • 查询Oracle和MySQL数据库中当前所有连接信息

    查询Oracle当前所有连接信息: 查询MySQL当前所有连接信息: 在这两个查询中,我为每个字段添加了中文别名,以提高查询结果的可读性

    2024年02月12日
    浏览(55)
  • Oracle数据库中,授权某用户可以查询其他用户的表

    在Oracle数据库中,授权一个用户可以查看其他所有用户的表,需要执行以下步骤: 使用数据库管理员账号连接到Oracle数据库。 通过 GRANT 命令给用户授予必要的权限。例如,如果要授权用户 user1 可以查看所有其他用户的表,可以执行以下命令: 这条命令将授予 user1  SELECT

    2024年02月08日
    浏览(58)
  • 导出Oracle数据库sqlplus命令行查询的结果到文件

    在Oracle数据库sqlplus命令行操作时,如果想将SQL查询出来的结果导出到文件中,可以使用SQLPlus中的 SPOOL 命令来将查询结果导出到文件。 1.开启日志记录:使用SPOOL命令,指定需要输出的文件路径及文件名。例如: SPOOL /存放路径/oracle.txt 2.执行SQL查询语句:你可以输入任何需要

    2024年02月15日
    浏览(30)
  • 【数据库】日常使用PL/SQL 登录ORACLE 数据库查询数据

    一、PL/SQL 登录方式 username: ##访问数据库的账号 password: ##访问数据库的密码 Databse: ##数据库IP地址/实例名 数据库集群心跳地址/实例名 Connect as : ##Normal,如果使用sysdba账户登录选择SYSDBA 二、PL/SQL使用SQL语句查询 点击上方导航栏,New,选择SQL Window,即可再次输入要查询的

    2024年02月19日
    浏览(54)
  • oracle查询数据库内全部的表名、列明、注释、数据类型、长度、精度等

    Oracle查询数据库内全部的表名、列明、注释、数据类型、长度、精度 效果图: 字段排序,根据表名对字段进行排序

    2024年02月06日
    浏览(41)
  • 查询服务器tns文件路径,oracle数据库tns配置方法详解

    Oracle中TNS的完整定义:transparence Network Substrate透明网络底层, 监听服务是它重要的一部分,不是全部,不要把TNS当作只是监听器。 上图中的CGDB和STDCG就是对应的TNS,HOST是指向数据库服务器的IP,当然局域网内用计算机名称也是可以的。通过客户端Net Manager创建一个连接到数据

    2024年02月09日
    浏览(47)
  • java serverlets使用数据源连接oracle数据库,并执行查询操作代码

    package chap03; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.PreparedStatement; import java.sql.Statement; import java.util.*; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.Namin

    2024年02月08日
    浏览(40)
  • SQL Server、MySQL和Oracle数据库分页查询的区别与联系

    摘要:本文将通过一个现实例子,详细解释SQL Server、MySQL和Oracle这三种常见关系型数据库在分页查询方面的区别与联系。我们将提供具体场景下的SQL语句示例,并解释每个数据库的分页查询用法以及优化方法,帮助读者更好地选择适合自己需求的分页查询方式。 假设我们有一

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包