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,这就相当于是向下进行,寻找它所有的子孙。

 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

CTE递归应用,树状结构,查询所有子部门、子部门数量、按层级显示部门名称

-- 建立演示环境 CREATE TABLE Dept( id int PRIMARY KEY, parent_id int, name nvarchar(20)) INSERT Dept S...

【知识记录】mysql树状结构表的递归查询

mysql数据库实现类似oracle connect by prior的查询

MySQL递归查询树状表的子节点、父节点

mysql5.0.94版本,该版本以及较高级的版本(5.5、6等等)尚未支持循环递归查询,和sqlserver、oracle相比,mysql难于在树状表中层层遍历的子节点。本程序重点参考前人的资料,写...

PostgreSQL递归查询实现树状结构查询

在Postgresql的使用过程中发现了一个很有意思的功能,就是对于需要类似于树状结构的结果可以使用递归查询实现。比如说我们常用的公司部门这种数据结构,一般我们设计表结构的时候都是类似下面的SQL,其...
  • kongxx
  • kongxx
  • 2015-07-24 09:02
  • 8541

18-Oracle学习_存储过程-递归-树状结构的存储与展示

一, 表 create table article ( id number primary key, cont varchar2(4000), pid number, ...

【JAVA秒会技术之搞定数据库递归树】Mysql快速实现递归树状查询

Mysql快速实现递归树状查询 【前言】今天一个好朋友问我的这个问题,以前也没有用到过,恰好有时间,就帮他研究了一下,纯属“现学现卖”,正好在过程中,自己也能学习一下!个人感觉,其实一点也不难,不过是...

oracle-递归查询地区名称

  • 2017-02-06 15:24
  • 274B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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