表    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

________________________________________

Go to source web page: Oracle–树的使用(Connect By) – 开发者在线 – www.builder.com.cn

该日志未加标签

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐