网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.在Oracle中添加用户 赋权 修改密.
.Oracle PL/SQL的第一次接触.
.对象库的使用.
.PL/SQL异常处理初步.
.ORACLE中如何实现ASCII字符串和1.
.Oracle数据库字符集问题解决方案.
.Oracle 管理的小tip.().
.ORACLE SQL性能优化 (下)(1).
.oracle中获取表空间ddl语句.
.手动制作Oracle9i/10g客户端的实.
.Oracle协作套件:完全集成数据库.
.备份的控制文件和新的数据文件.
.Oracle琐.
.用一个实例讲解如何正确使用数据.
.新手入门 Windows下Oracle安装图.
.Oracle9i新特性-索引监视及注意事.
.如何修改oracle默认internal用户.
.Oracle数据库常见错误操作及解决.
.Oracle904InstalOnRedHatAS3.
.用Control file恢复DB运行.

深入了解Oracle 10g新型层次查询选项

发表日期:2008-2-9



  我们可以通过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
  
  在Oracle 10g 中还有一个新操作——CONNECT_BY_ROOT。 它用在列名之前用于返回当前层的根节点。如下面的例子,我可以显示出层次结构表中当前行数据所对应的最高等级节点的内容。
  
  select connect_by_root child,sys_connect_by_path(child,'/') path
  from hier
  start with parent is null
  connect by prior child = parent;
  
  CONNECT_BY_ROOT PATH
  ------------------------------ --------
  Asia /Asia
  Asia /Asia/China
  Asia /Asia/China/Beijing
  Asia /Asia/Japan
  Asia /Asia/Japan/Osaka
  Asia /Asia/Japan/Tokyo
  Australia /Australia
  Australia /Australia/New South Wales
  Australia /Australia/New South Wales/Sydney
  Europe /Europe
  Europe /Europe/United Kingdom
  Europe /Europe/United Kingdom/England
  Europe /Europe/United Kingdom/England/London
  North America /North America
  North America /North America/Canada
  North America /North America/Canada/Ontario
  North America /North America/Canada/Ontario/Ottawa
  North America /North America/Canada/Ontario/Toronto
  North America /North America/USA
  North America /North America/USA/California
  North 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,'/') path
  from hier2
  start with parent is null
  connect by nocycle prior child = parent;

  
  CONNECT_BY_ISCYCLE PATH
  ------------------ -------
  0 /1
  0 /1/2
  1 /1/2/3
上一篇:Oracle高级技巧 人气:551
下一篇:用排序哈希簇来提升ORACLE查询速度 人气:538
浏览全部Oracle教程的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐