Oracle--树的使用(ConnectBy)

王朝oracle·作者佚名  2008-05-19
宽屏版  字体: |||超大  

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有