Oracle 10g数据库里面新型层次查询选项简略介绍(1)_Oracle数据库_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

Oracle10g里面新型层次查询选项简略介绍(1)

作者:黑客防线网安Oracle维护基地 来源:黑客防线网安Oracle维护基地 浏览次数:0

黑客防线网安网讯:我们可以通过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 a40select level,lpad(' ',level*3)||child childfrom hierstart with parent is nullconnect by prior child = parent;LEVEL CHILD---------- --------------------------1 Asia2 China3 Beijing2 Japan3 Osaka3 Tokyo1 Australia2 New South Wales3 Sydney1 Europe2 United Kingdom3 England4 London1 North America2 Canada3 Ontario4 Ottawa4 Toronto2 USA3 California4 Redwood Shores

自从Since Oracle 9i 开始,就可以通过 SYS_CONNECT_BY_PATH 函数实现将从父节点到当前行内容以“path”或者层次元素列表的形式显示出来。 如下例所示:

column path format a50select level,sys_connect_by_path(child,'/') pathfrom hierstart with parent is nullconnect by prior child = parent;LEVEL PATH -------- --------------------------------------------1 /Asia2 /Asia/China3 /Asia/China/Beijing2 /Asia/Japan3 /Asia/Japan/Osaka3 /Asia/Japan/Tokyo1 /Australia2 /Australia/New South Wales3 /Australia/New South Wales/Sydney1 /Europe2 /Europe/United Kingdom3 /Europe/United Kingdom/England4 /Europe/United Kingdom/England/London1 /North America2 /North America/Canada3 /North America/Canada/Ontario4 /North America/Canada/Ontario/Ottawa4 /North America/Canada/Ontario/Toronto2 /North America/USA3 /North America/USA/California4 /North America/USA/California/Redwood Shores
 
在 Oracle 10g 中,还有其他更多关于层次查询的新特性 。例如,有的时候用户更关心的是每个层次分支中等级最低的内容。那么你就可以利用伪列函数CONNECT_BY_ISLEAF来判断当前行是不是叶子。如果是叶子就会在伪列中显示“1”,如果不是叶子而是一个分支(例如当前内容是其他行的父亲)就显示“0”。下给出了一个关于这个函数使用的例子: select connect_by_isleaf,sys_connect_by_path(child,'/') pathfrom hierstart with parent is nullconnect by prior child = parent;CONNECT_BY_ISLEAF PATH----------------------------------
0 /Asia0 /Asia/China1 /Asia/China/Beijing0 /Asia/Japan1 /Asia/Japan/Osaka1 /Asia/Japan/Tokyo0 /Australia0 /Australia/New South Wales1 /Australia/New South Wales/Sydney0 /Europe0 /Europe/United Kingdom0 /Europe/United Kingdom/England1 /Europe/United Kingdom/England/London0 /North America0 /North America/Canada0 /North America/Canada/Ontario1 /North America/Canada/Ontario/Ottawa1 /North America/Canada/Ontario/Toronto0 /North America/USA0 /North America/USA/California1 /North America/USA/California/Redwood Shores 

自从Since Oracle 9i 开始,就可以通过 SYS_CONNECT_BY_PATH 函数实现将从父节点到当前行内容以“path”或者层次元素列表的形式显示出来。 如下例所示:

column path format a50select level,sys_connect_by_path(child,'/') pathfrom hierstart with parent is nullconnect by prior child = parent;LEVEL PATH -------- --------------------------------------------1 /Asia2 /Asia/China3 /Asia/China/Beijing2 /Asia/Japan3 /Asia/Japan/Osaka3 /Asia/Japan/Tokyo1 /Australia2 /Australia/New South Wales3 /Australia/New South Wales/Sydney1 /Europe2 /Europe/United Kingdom3 /Europe/United Kingdom/England4 /Europe/United Kingdom/England/London1 /North America2 /North America/Canada3 /North America/Canada/Ontario4 /North America/Canada/Ontario/Ottawa4 /North America/Canada/Ontario/Toronto2 /North America/USA3 /North America/USA/California4 /North America/USA/California/Redwood Shores

在 Oracle 10g 中,还有其他更多关于层次查询的新特性 。例如,有的时候用户更关心的是每个层次分支中等级最低的内容。那么你就可以利用伪列函数CONNECT_BY_ISLEAF来判断当前行是不是叶子。如果是叶子就会在伪列中显示“1”,如果不是叶子而是一个分支(例如当前内容是其他行的父亲)就显示“0”。下给出了一个关于这个函数使用的例子:

select connect_by_isleaf,sys_connect_by_path(child,'/') pathfrom hierstart with parent is nullconnect by prior child = parent;CONNECT_BY_ISLEAF PATH---------------------------------- ------------0 /Asia0 /Asia/China1 /Asia/China/Beijing0 /Asia/Japan1 /Asia/Japan/Osaka1 /Asia/Japan/Tokyo0 /Australia0 /Australia/New South Wales1 /Australia/New South Wales/Sydney0 /Europe0 /Europe/United Kingdom0 /Europe/United Kingdom/England1 /Europe/United Kingdom/England/London0 /North America0 /North America/Canada0 /North America/Canada/Ontario1 /North America/Canada/Ontario/Ottawa1 /North America/Canada/Ontario/Toronto0 /North America/USA0 /North America/USA/California1 /North America/USA/California/Redwood Shores

在Oracle 10g 中还有一个新操作——CONNECT_BY_ROOT。 它用在列名之前用于返回当前层的根节点。如下面的例子,我可以显示出层次结构表中当前行数据所对应的最高等级节点的内容。

select connect_by_root child,sys_connect_by_path(child,'/') pathfrom hierstart with parent is nullconnect by prior child = parent;CONNECT_BY_ROOT PATH------------------------------ -------- Asia /AsiaAsia /Asia/ChinaAsia /Asia/China/BeijingAsia /Asia/JapanAsia /Asia/Japan/OsakaAsia /Asia/Japan/TokyoAustralia /AustraliaAustralia /Australia/New South WalesAustralia /Australia/New South Wales/SydneyEurope /EuropeEurope /Europe/United KingdomEurope /Europe/United Kingdom/EnglandEurope /Europe/United Kingdom/England/LondonNorth America /North AmericaNorth America /North America/CanadaNorth America /North America/Canada/OntarioNorth America /North America/Canada/Ontario/OttawaNorth America /North America/Canada/Ontario/TorontoNorth America /North America/USANorth America /North America/USA/CaliforniaNorth America /North America/USA/California/Redwood Shores  

在Oracle 10g 之前的版本中,如果在你的树中出现了环状循环(如一个孩子节点引用一个父亲节点),Oracle 就会报出一个错误提示:“ ORA-01436: CONNECT BY loop in user data”。如果不删掉对父亲的引用就无法执行查询操作。而在 Oracle 10g 中,只要指定“NOCYCLE”就可以进行任意的查询操作。与这个关键字相关的还有一个伪列——CONNECT_BY_ISCYCLE, 如果在当前行中引用了某个父亲节点的内容并在树中出现了循环,那么该行的伪列中就会显示“1”,否则就显示“0”。如下例所示:

create table hier2(parent number,child number);insert into hier2 values(null,1);insert into hier2 values(1,2);insert into hier2 values(2,3);insert into hier2 values(3,1);select connect_by_iscycle,sys_connect_by_path(child,'/') pathfrom hier2start with parent is nullconnect by nocycle prior child = parent;CONNECT_BY_ISCYCLE PATH------------------ -------0 /10 /1/21 /1/2/3

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-12723-1.html
网站维护教程更新时间:2012-03-23 00:45:06  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer