Oracle递归查询简单示例

目录
  • 1 数据准备
  • 2 start with connect by prior递归查询
    • 2.1 查询所有子节点
    • 2.2 查询所有父节点
    • 2.3 查询指定节点的,根节点
    • 2.4 查询巴中市下行政组织递归路径
  • 3 with递归查询
    • 3.1 with递归子类
    • 3.2 递归父类
  • 补充:实例
  • 总结

1 数据准备

create table area_test(
  id         number(10) not null,
  parent_id  number(10),
  name       varchar2(255) not null
);

alter table area_test add (constraint district_pk primary key (id));

insert into area_test (ID, PARENT_ID, NAME) values (1, null, '中国');
insert into area_test (ID, PARENT_ID, NAME) values (11, 1, '河南省');
insert into area_test (ID, PARENT_ID, NAME) values (12, 1, '北京市');
insert into area_test (ID, PARENT_ID, NAME) values (111, 11, '郑州市');
insert into area_test (ID, PARENT_ID, NAME) values (112, 11, '平顶山市');
insert into area_test (ID, PARENT_ID, NAME) values (113, 11, '洛阳市');
insert into area_test (ID, PARENT_ID, NAME) values (114, 11, '新乡市');
insert into area_test (ID, PARENT_ID, NAME) values (115, 11, '南阳市');
insert into area_test (ID, PARENT_ID, NAME) values (121, 12, '朝阳区');
insert into area_test (ID, PARENT_ID, NAME) values (122, 12, '昌平区');
insert into area_test (ID, PARENT_ID, NAME) values (1111, 111, '二七区');
insert into area_test (ID, PARENT_ID, NAME) values (1112, 111, '中原区');
insert into area_test (ID, PARENT_ID, NAME) values (1113, 111, '新郑市');
insert into area_test (ID, PARENT_ID, NAME) values (1114, 111, '经开区');
insert into area_test (ID, PARENT_ID, NAME) values (1115, 111, '金水区');
insert into area_test (ID, PARENT_ID, NAME) values (1121, 112, '湛河区');
insert into area_test (ID, PARENT_ID, NAME) values (1122, 112, '舞钢市');
insert into area_test (ID, PARENT_ID, NAME) values (1123, 112, '宝丰市');
insert into area_test (ID, PARENT_ID, NAME) values (11221, 1122, '尚店镇');

2 start with connect by prior递归查询

2.1 查询所有子节点

select *
from area_test
start with name ='郑州市'
connect by prior id=parent_id

2.2 查询所有父节点

select t.*,level
from area_test t
start with name ='郑州市'
connect by prior t.parent_id=t.id
order by level asc;

start with 子句:遍历起始条件,如果要查父结点,这里可以用子结点的列,反之亦然。
connect by 子句:连接条件。prior 跟父节点列parentid放在一起,就是往父结点方向遍历;prior 跟子结点列subid放在一起,则往叶子结点方向遍历。parent_id、id两列谁放在“=”前都无所谓,关键是prior跟谁在一起。
order by 子句:排序。

2.3 查询指定节点的,根节点

select d.*,
	   connect_by_root(d.id) rootid,
	   connect_by_root(d.name) rootname
from area_test d
where name='二七区'
start with d.parent_id IS NULL
connect by prior d.id=d.parent_id

2.4 查询巴中市下行政组织递归路径

select id, parent_id, name, sys_connect_by_path(name, '->') namepath, level
from area_test
start with name = '平顶山市'
connect by prior id = parent_id

3 with递归查询

3.1 with递归子类

with tmp(id, parent_id, name)
as (
	select id, parent_id, name
    from area_test
    where name = '平顶山市'
    union all
    select d.id, d.parent_id, d.name
    from tmp, area_test d
    where tmp.id = d.parent_id
   )
select * from tmp;

3.2 递归父类

with tmp(id, parent_id, name)
as
  (
   select id, parent_id, name
   from area_test
   where name = '二七区'
   union all
   select d.id, d.parent_id, d.name
   from tmp, area_test d
   where tmp.parent_id = d.id
   )
select * from tmp;

补充:实例

我们称表中的数据存在父子关系,通过列与列来关联的,这样的数据结构为树结构。

现在有一个menu表,字段有id,pid,title三个。

查询菜单id为10的所有子菜单。

SELECT * FROM tb_menu m START WITH m.id=10 CONNECT BY m.pid=PRIOR m.id;

将PRIOR关键字放在m.id前面,意思就是查询pid是当前记录id的记录,如此顺延找到所有子节点。

查询菜单id为40的所有父菜单。

SELECT * FROM tb_menu m START WITH m.id=40 CONNECT BY PRIOR m.pid= m.id ORDER BY ID;

总结

到此这篇关于Oracle递归查询的文章就介绍到这了,更多相关Oracle递归查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 深入sql oracle递归查询

    ☆ 获取数据库所有表名,表的所有列名   select name from sysobjects where xtype='u'   select name from syscolumns where id=(select max(id) from sysobjects where xtype='u' and name='表名') ☆ 递归查询数据Sql语句里的递归查询 SqlServer2005和Oracle 两个版本以前使用Oracle,觉得它的递归查询很好用,就研究了一下SqlServer

  • Oracle通过递归查询父子兄弟节点方法示例

    前言 说到Oracle中的递归查询语法,我觉得有一些数据库基础的童鞋应该都知道,做项目的时候应该也会用到,下面本文就来介绍下关于Oracle通过递归查询父子兄弟节点的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 方法如下: 1.查询某节点下所有后代节点(包括各级父节点) // 查询id为101的所有后代节点,包含101在内的各级父节点 select t.* from SYS_ORG t start with id = '101' connect by parent_

  • Oracle递归查询connect by用法

    目录 一.概述 1.层级查询的基本语法: 二.使用 1.基本用法 2.SYS_CONNECT_BY_PATH() 函数 3.CONNECT_BY_ISLEAF 伪列 4.CONNECT_BY_ROOT 字段x -> 找到该节点最顶端节点的字段x 5.10g新特性 采用sibilings排序 三.与row num 生成序列记录 1.简单序列: 2.生成10-14的连续数(10开始,5行数据) 3.生成a-d的四个字母 4.生成2011-01-05至2011-01-10的日期 5.字符串分割,由一行

  • Oracle递归查询start with connect by prior的用法

    一.基本语法 connect by递归查询基本语法是: select 1 from 表格 start with ... connect by prior id = pId start with:表示以什么为根节点,不加限制可以写1=1,要以id为123的节点为根节点,就写为start with id =123 connect by:connect by是必须的,start with有些情况是可以省略的,或者直接start with 1=1不加限制 prior:prior关键字可以放在等号的前面,

  • Oracle递归查询简单示例

    目录 1 数据准备 2 start with connect by prior递归查询 2.1 查询所有子节点 2.2 查询所有父节点 2.3 查询指定节点的,根节点 2.4 查询巴中市下行政组织递归路径 3 with递归查询 3.1 with递归子类 3.2 递归父类 补充:实例 总结 1 数据准备 create table area_test( id number(10) not null, parent_id number(10), name varchar2(255) not null

  • Java使用Jdbc连接Oracle执行简单查询操作示例

    本文实例讲述了Java使用Jdbc连接Oracle执行简单查询操作.分享给大家供大家参考,具体如下: Java Jdbc 连接 Oracle 执行简单查询示例: package com.test.dbtest; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLExce

  • Java通用Mapper UUID简单示例

    #通用 Mapper UUID 简单示例 ##不可回写的 UUID 通用 Mapper 中对 UUID 的用法主要提到了一种专有的写法,如下写法: @GeneratedValue(generator = "UUID") 这种方式实现很容易理解,就是在你 insert 之前,调用 UUID 的公共方法在<bind> 标签中生成了一个值,插入到了数据库,由于这个值是临时的,并没有set到对象,因此这种方式是不支持回写的. 由于回写方式很常见,因此用这种方式很难满足要求. 而且在

  • 用python对oracle进行简单性能测试

    一.概述 dba在工作中避不开的两个问题,sql使用绑定变量到底会有多少的性能提升?数据库的审计功能如果打开对数据库的性能会产生多大的影响?最近恰好都碰到了,索性做个实验. sql使用绑定变量对性能的影响 开通数据库审计功能对性能的影响 实验采用的办法很简单,就是通过python读取csv文件,然后将其导入到数据库中,最后统计程序执行完成所需要的时间 二.准备脚本 python脚本dataimporttest.py # author: yangbao # function: 通过导入csv,测试

  • oracle求和代码示例

    有一张工资表SALARY如下, (NO 员工编号 ,MONEY 工资) NO    NAME     ITEM       MONEY 001    张三        工资        80 001    张三        补贴        86 001    张三        奖金        75 002    李四        工资        78 002    李四        补贴        85 002    李四        奖金        78 求每

  • java求100之内的素数(质数)简单示例

    质数又称素数.一个大于1的自然数,如果除了1和它自身外,不能被其他自然数整除的数:否则称为合数.根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积:而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的.下面是一个java求100之内的素数简单示例 复制代码 代码如下: public class test { public static void main(String[] args) {  int i,n,k=0;     for (n = 3; n

  • CI框架入门之MVC简单示例

    本文实例讲述了CI框架入门之MVC简单示例.分享给大家供大家参考,具体如下: 最简单的CI模型: 注意:模型需要用到数据库 配置文件在appcation/config.php 这里我们要用到数据库,需要将databases.php中的相关参数填写一下,具体不再赘述. 直接进入主题: MVC: 1.首先谈"M" 模型 CI中的模型存放在application/models文件夹里 命名规则是:类名_model.php 文件中只包含一个类: 如: class Nb_model extend

  • jquery easyui DataGrid简单示例

    一.简单示例 HTML <table id="tbList" striped="true" rownumbers="true" fix="true" fitcolumns="true" title="标题" idfield="ID" checkbox="true" url="@Url.Action("ListData&qu

随机推荐