Oracle中的树状查询(递归查询)

原创 2007年09月30日 15:06:00

数据库中有一个表,结构很简单,如下所示:

表名:TBInvoice

字段:id

      name

      parent_id

每一行记录表示一个发票,parent_id表示它的父对象id,假设现在表中有如下数据:

id          name          parent_id

1                                       张三         

2                                       李四          1

3                                       王五          1

4                                       张一          2

5                                       王三          2

6                                       武松          3

7                                       李四          4

8                                       朱大          5

9                                       曾子          5

10                                    常三          6

这样就形成了如下一个树,我们暂且称它们为一个家族吧。

1

2

3

4

5

6

7

8

9

10

现在有这样一个需求,给定一个id,要查出这个id所述家族中的所有id,比方说无论是给定1-10中的哪一个id,都必须查出这个家族中的所有id,并且不能出现别的家族中的id。这里我们可以使用Oracle自带的树状查询函数:

SELECT ..

CONNECT BY {PRIOR 列名1=列名2|列名1=PRIOR 列名2}
    [START WITH]

现在以id=5为例,要求查出它所属家族中的所有id

思路:在家族书中进行回溯,向上查找,得到祖先id

首先我们用如下的语句:

Select id from TBInvoice connect by id=prior parentid start with id=5,这条语句从id=5处向上查找,一直到祖先节点为止。在本表中所有的顶层节点的parentid都是null

接着我们利用下面的语句得到祖先节点的id

Select id from

            (Select id from TBInvoice connect by id=prior parentid start with id=5)

Where parentid is null

这样我们就得到了id 5所属家族的祖先id

最后,我们就需要根据祖先id向下进行查找,得到所有的子id

Select id from TBInvoice connect by prior id=parentid start with id=

(Select id from

            (Select id from TBInvoice connect by id=prior parentid start with id=5)

Where parentid is null)

如此一来我们就可以得到id 5所属家族中的所有id了。

在整个过程,起关键作用的就是prior这个关键字,它代表什么意思呢?它的英文意思为“优先的”,在这里可以这样理解:

priorparentid之前时,说明parentid优先,如果start with id=5,那么从id=5的那条记录开始查找,后面的记录都必须是id等于前面记录的parentid,这样就表明是向上进行查找,追溯它所有的祖先。

priorid之前时,说明id优先,如果start with id=5,那么从id=5的那条记录开始查找,后面的记录都必须是parentid=前面记录的id,这就相当于是向下进行,寻找它所有的子孙。

 

Oracle 递归查询

Oracle 递归查询 递归查询的一个典型的例子是对树状结构的表进行查询,考虑如下的情况: 论坛首页 --数据库开发 ----DB2 ------DB2 文章1 --------DB2 文章1...
  • shangboerds
  • shangboerds
  • 2015年06月16日 22:08
  • 1315

Oracle 循环递归遍历树结构查询

在项目中经常会接触树结构的页面; 经常会写关于查询某个树节点的所有子节点的方法,若使用java的for循环或者递归不但效率低又好性能。所以推荐使用oracle 提供的connect by prior ...
  • vrenzhuv
  • vrenzhuv
  • 2015年10月27日 16:38
  • 928

PLSql -- 递归查询的另几种实现方式(函数/存储过程)

利用函数/存储过程/WITH实现递归查询,这是一个树结构,查询教师“胡明星”的所有主管及姓名:(无主管的教师也需要显示),显示(教师编号、教师名称、主管编号、主管名称)......
  • zhao__fang
  • zhao__fang
  • 2016年08月01日 15:54
  • 1753

Oracle实现递归查询

有如下表Tree: 现在要递归查询冶炼(id=2)的所有父节点和子节点:SELECT * FROM tree START WITH id = 2 CONNECT BY PRIOR pid = i...
  • zhangzeyuaaa
  • zhangzeyuaaa
  • 2016年08月24日 20:36
  • 12364

oracle 递归层次查询

工作需要,要查询一个节点的所有子节点信息,在网上找了很久,没有看到直接的例子的,很多理论,所以给个例子,作为我这种小白水平的人看看: 举例子: create table SCAN_MERC_INFO ...
  • CociJava
  • CociJava
  • 2016年08月18日 17:02
  • 2334

oracle中的层级递归查询操作

oracle中的层级操作非常方便,在使用之后爱不释手,以前要实现该种数据查询操作,需要非常复杂的实现过程。在oracle中通过connect by可以实现前面的目的,通常情况下层级查询基本都能实现递归...
  • zouqingfang
  • zouqingfang
  • 2013年10月24日 16:11
  • 2840

Oracle SQL:select各类查询语句总结

Oracle select SQL 各类查询语句总结
  • yihuiworld
  • yihuiworld
  • 2015年03月28日 11:45
  • 23805

oracle查询语句大全(oracle 基本命令大全一)

1.create user username identified by password;//建用户名和密码oracle ,oracle 2.grant connect,resource,dba t...
  • sheng__sheng
  • sheng__sheng
  • 2013年10月05日 21:32
  • 1860

Oracle 11g的递归with语句

废话不多说,直接上例子感受一下: with emps (employee_id, name, job_id, salary, lvl) as ( select employee_id, first...
  • chncaesar
  • chncaesar
  • 2014年01月06日 22:58
  • 3866

Oracle基本语法查询语句

Oracle基本查询语法 本文含含: 基础/基本查询/排序/函数(单/多) 一.前言知识 1.oracle如何操作硬盘上的文件,最终都是以进程方式操作硬盘上的文件,最基本进程:读 写 ,还有其他客户...
  • qq_33497137
  • qq_33497137
  • 2016年12月21日 20:55
  • 874
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Oracle中的树状查询(递归查询)
举报原因:
原因补充:

(最多只允许输入30个字)