您的位置:首页 > 数据库

SQL语句汇总(二)

2015-11-24 15:12 274 查看
转自: http://www.cnblogs.com/HondaHsu/archive/2007/06/28/798517.html
5.树的使用(connect by)

表 tree

字段 master sub sales

insert into tree values('主1', '主2', 15); insert into tree values('主1', '主3', 20);

insert into tree values('主2', '主4', 5); insert into tree values('主2', '主5', 10);

insert into tree values('主3', '主5', 30); insert into tree values('主3', '主6', 40);

SQL> select * from tree;

MASTER SUB SALES

---------- ---------- ----------

主1 主2 15

主1 主3 20

主2 主4 5

主2 主5 10

主3 主5 30

主3 主6 40

如果用树型结构表示如下:

'主1'

-'主2'

--'主4'

--'主5'

'主1'

-'主3'

--'主5'

--'主6'

SQL> select * from tree

start with sub='主2' --相当于普通sql的where条件

connect by prior master=sub; --遍历的顺序是sub先于master遍历,也就是说从sub往上遍历一直到master(根节点)

2

MASTER SUB SALES

---------- ---------- ----------

主1 主2 15

SQL> select * from tree start with master='主2'

connect by prior master=sub; --sub往上遍历至根节点(参考一下树型图)

2 3

MASTER SUB SALES

---------- ---------- ----------

主2 主4 5 --这条是自己本身,也就是第一遍遍历

主1 主2 15 --这是第2次遍历,我们从树型图可以看到,'主2'往上遍历是'主1'

主2 主5 10

主1 主2 15

好,我们关看上面可能还是不好理解,我们加入一个树结构专用函数sys_connect_by_path,便于理解

SQL> select sys_connect_by_path(MASTER,'/') from tree --master表示我遍历的起点只找在master列中存在的,如下例只要'主2'为起点,并以/为分割符

start with master='主2'

connect by prior master=sub; --往根节点遍历

2 3

SYS_CONNECT_BY_PATH(MASTER,'/')

--------------------------------------------------------------------------------

/主2 --第1遍遍历

/主2/主1 --第2遍遍历

/主2 --第2条master='主2'的记录的第1次遍历

/主2/主1 --第2条master='主2'的记录的第2次遍历

SQL> select sys_connect_by_path(MASTER,'/') from tree --起点为sub='主5'时MASTER=主2,主3

start with sub='主5'

connect by prior master=sub;

2 3

SYS_CONNECT_BY_PATH(MASTER,'/')

--------------------------------------------------------------------------------

/主2

/主2/主1

/主3

/主3/主1

SQL> select sys_connect_by_path(MASTER,'/'),sub,master from tree

start with sub is not null

connect by prior master=sub;

2 3

SYS_CONNECT_BY_PATH(MASTER,'/' SUB MASTER

------------------------------ ---------- ----------

/主1 主2 主1 --找主1到根的路径,这里根是主1他自己

/主1 主3 主1

/主2 主4 主2

/主2/主1 主2 主1 --找主2到根的路径,这里根是主1

/主2 主5 主2

/主2/主1 主2 主1

/主3 主5 主3

/主3/主1 主3 主1

/主3 主6 主3

/主3/主1 主3 主1

select sys_connect_by_path(MASTER,'/'),sub,master from tree

start with sub is not null

connect by prior sub = master;

SYS_CONNECT_BY_PATH(MASTER,'/' SUB MASTER

------------------------------ ---------- ----------

/主1 主2 主1

/主1/主2 主4 主2

/主1/主2 主5 主2

/主1 主3 主1

/主1/主3 主5 主3

/主1/主3 主6 主3

/主2 主4 主2

/主2 主5 主2

/主3 主5 主3

/主3 主6 主3
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: