您好,欢迎访问一九零五行业门户网

Oracle10g中层次查询简介

我们可以通过start with . . . connect by . . .子句来实现sql的 层次查询,而oracle 10g 为其添加许多了新的伪列。十多年以来,oracle sql 具有依照层次关系进行查询的 功能。例如,你可以指定一个起始条件,然后根据一个或多个连接条件来确定孩子行的内容
我们可以通过start with . . . connect by . . .子句来实现sql的 层次查询,而oracle 10g 为其添加许多了新的伪列。十多年以来,oracle sql 具有依照层次关系进行查询的 功能。例如,你可以指定一个起始条件,然后根据一个或多个连接条件来确定孩子行的内容。举例来说,现在假设我有一个表,里面记录了世界上的某些地区,其表结构如下:
create table hier
(
parent varchar2(30),
child varchar2(30)
);
insert into hier values(null,'asia');
insert into hier values(null,'australia');
insert into hier values(null,'europe');
insert into hier values(null,'north america');
insert into hier values('asia','china');
insert into hier values('asia','japan');
insert into hier values('australia','new south wales');
insert into hier values('new south wales','sydney');
insert into hier values('california','redwood shores');
insert into hier values('canada','ontario');
insert into hier values('china','beijing');
insert into hier values('england','london');
insert into hier values('europe','united kingdom');
insert into hier values('japan','osaka');
insert into hier values('japan','tokyo');
insert into hier values('north america','canada');
insert into hier values('north america','usa');
insert into hier values('ontario','ottawa');
insert into hier values('ontario','toronto');
insert into hier values('usa','california');
insert into hier values('united kingdom','england');
那么我们可以使用start with . . . connect by . . .从句将父级地区与孩子地区连接起来,并将其层次等级显示出来。
column child format a40
select level,lpad(' ',level*3)||child child
from hier
start with parent is null
connect by prior child = parent;
level child
---------- --------------------------
1 asia
2 china
3 beijing
2 japan
3 osaka
3 tokyo
1 australia
2 new south wales
3 sydney
1 europe
2 united kingdom
3 england
4 london
1 north america
2 canada
3 ontario
4 ottawa
4 toronto
2 usa
3 california
4 redwood shores
自从since oracle 9i 开始,就可以通过 sys_connect_by_path 函数实现将从父节点到当前行内容以“path”或者层次元素列表的形式显示出来。 如下例所示:
column path format a50
select level,sys_connect_by_path(child,'/') path
from hier
start with parent is null
connect by prior child = parent;
level path
-------- --------------------------------------------
1 /asia
2 /asia/china
3 /asia/china/beijing
2 /asia/japan
3 /asia/japan/osaka
3 /asia/japan/tokyo
1 /australia
2 /australia/new south wales
3 /australia/new south wales/sydney
1 /europe
2 /europe/united kingdom
3 /europe/united kingdom/england
4 /europe/united kingdom/england/london
1 /north america
2 /north america/canada
3 /north america/canada/ontario
4 /north america/canada/ontario/ottawa
4 /north america/canada/ontario/toronto
2 /north america/usa
3 /north america/usa/california
4 /north america/usa/california/redwood shores
在 oracle 10g 中,还有其他更多关于层次查询的新特性 。例如,有的时候用户更关心的是每个层次分支中等级最低的内容。那么你就可以利用伪列函数connect_by_isleaf来判断当前行是不是叶子。如果是叶子就会在伪列中显示“1”,如果不是叶子而是一个分支(例如当前内容是其他行的父亲)就显示“0”。下给出了一个关于这个函数使用的例子: select connect_by_isleaf,sys_connect_by_path(child,'/') path
from hier
start with parent is null
connect by prior child = parent;
connect_by_isleaf path
----------------------------------
0 /asia
0 /asia/china
1 /asia/china/beijing
0 /asia/japan
1 /asia/japan/osaka
1 /asia/japan/tokyo
0 /australia
0 /australia/new south wales
1 /australia/new south wales/sydney
0 /europe
0 /europe/united kingdom
0 /europe/united kingdom/england
1 /europe/united kingdom/england/london
0 /north america
0 /north america/canada
0 /north america/canada/ontario
1 /north america/canada/ontario/ottawa
1 /north america/canada/ontario/toronto
0 /north america/usa
0 /north america/usa/california
1 /north america/usa/california/redwood shores
其它类似信息

推荐信息