java tree.left oracle_oracle中的树状查询

今天闲来无事,把Oracle的树状查询再看了一遍,以下是我的理解

Oracle的树状查询语句很简单SELECT 。。。START WITH condition CONNECT BY condition;

Oracle使用树状结构的目的是:

1.用二维表的形式记录树状结构

2.查询二维表来构造树状结构,一般都是根据一个对象向上查询查出它所有的祖先,根据一个对象向下查询查出它所有的子孙

树状结构的特点就是一个子只有一个父,一个父可以有多个子。那只要每一个对象知道了他的父对象,就可以手动的构造出树状结构。也就是说,有多少个对象在二维表中就需要多少行,每一个对象都有一个指出它的父对象是字段。

看图中所示,二维表应该表示为

对象                      父对象

36ce50b849aebf8e4b5cd6a270f12ce7.png

以下是创建表的命令

SQL> create table tree_t (id char,p_id char);Tablecreated.

SQL> insert into tree_t values('A',NULl);1row created.

SQL> insert into tree_t values('B','A');1row created.

SQL> insert into tree_t values('C','A');1row created.

SQL> insert into tree_t values('D','A');1row created.

SQL> insert into tree_t values('E','B');1row created.

SQL> insert into tree_t values('F','B');1row created.

SQL> insert into tree_t values('G','C');1row created.

SQL> insert into tree_t values('H','D');1row created.

SQL> insert into tree_t values('I','F');1row created.

SQL> insert into tree_t values('J','H');1row created.

SQL> insert into tree_t values('K','H');1row created.

SQL> commit;Commit complete.

SQL> select * from tree_t;

89dc06257b1c5b35278ff88adcbc355f.png

那怎样根据二维表中的记录查询一个对象的祖先和子孙呢,这就要用到SELECT 。。。START WITH condition CONNECT BY condition命令了

1.先要确定查询哪个对象的祖先和子孙

这要用到START WITH condition,只要满足条件的行,都可以做为查询的对象,也就是说,在一个查询中可以查询多个对象的祖先和子孙

2.再确定对象的字段和父对象的字段,向上查询还是向下查询

CONNECT BY prior id = p_id        对象字段为id,父对象字段为p_id,向下查询

CONNECT BY id = prior p_id        对象字段为id,父对象字段为p_id,向上查询

下面是举例

查询ID = D的子孙

SQL> select * from tree_t start with id = 'D' connect by prior id = p_id;

3f44b4ee2faa5135757e9f90a7f5f1d3.png

查询ID = D祖先

SQL> select * from tree_t start with id = 'D' connect by id = prior p_id;

2a9bc8248c4e33fd21d310d3d29078e6.png

查询P_ID = B的行的对象的祖先,这就是查询多个对象,因为P_ID = B的对象有两个,E和F,查询E和F的祖先

SQL> select * from tree_t start with p_id = 'B' connect by id = prior p_id;

9b3690488316c07f386ab6a3a4ff97f0.png

本文转自:http://blog.itpub.net/8745319/viewspace-569133

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值