工作需要,要查询一个节点的所有子节点信息,在网上找了很久,没有看到直接的例子的,很多理论,所以给个例子,作为我这种小白水平的人看看:

举例子:

create table SCAN_MERC_INFO
(
  com_merc_id          VARCHAR2(32) not null, //当前节点
 
  superior_com_merc_id VARCHAR2(32),//父节点

)

--ok  根节点向子节点查
selectcom_merc_id,superior_com_merc_id from scan_merc_info
start with com_merc_id = 'qr8'  //这里也可以查询多个节点的,用or 或者是in都可以

connect by prior com_merc_id = superior_com_merc_id

--ok  子节点向根节点查
select merc_id,com_merc_id,superior_com_merc_id,self_level from scan_merc_info
start with com_merc_id = 'qr8'
connect by PRIOR  superior_com_merc_id = com_merc_id

--取得该节点的所有父节点和所有子节点
select com_merc_id          from scan_merc_info
start with com_merc_id = 'qr8'
connect by PRIOR  superior_com_merc_id = com_merc_id 
union

select com_merc_idfrom scan_merc_info

start with com_merc_id = 'qr8'
connect by PRIOR com_merc_id = superior_com_merc_id

理论来袭:

CONNECT BY 子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。PRIORY 运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,PRIOR 运算符所在的列表示该列是父节点,相应的另一列则表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达式。START WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。

START WITH选项:不但可以指定一个根节点,还可以指定多个根节点。

http://blog.csdn.net/nsj820/article/details/6299276

语法格式:

select [level], column, expr... from table
[where condition]
start with condition
connect by [prior column1= column2 |
column1 = prior column2];

层次查询是通过start with和connect by子句标识的:

1.其中level关键字是可选的,表示等级,1表示root,2表示root的child,其他相同的规则。

2.From之后可以是table,view但是只能是一个table。

3.Where条件限制了查询返回的行,但是不影响层次关系,属于将节点截断,但是这个被截断的节点的下层child不受影响。

4.Start with是表示开始节点,对于一个真实的层次关系,必须要有这个子句,但是不是必须的。

5.connect by prior是指定父子关系,其中prior的位置不一定要在connect by之后,对于一个真实的层次关系,这也是必须的。

对于from是视图的,那么这个view不能包含join。

层次查询限制

1.层次查询from 之后如果是table,只能是一个table,不能有join。

2.from之后如果是view,则view不能是带join的。

3.使用order by子句,order子句是在等级层次做完之后开始的,所以对于层次查询来说没有什么意义,除非特别关注level,获得某行在层次中的深度,但是这两种都会破坏层次。见增强特性中的使用siblings排序。

4.在start with中表达式可以有子查询,但是connect by中不能有子查询。

层次查询的增强特性

1、SYS_CONNECT_BY_PATH

Oracle 9i提供了sys_connect_by_path(column,char),其中column是字符型或能自动转换成字符型的列名。它的主要目的就是将父节点到当前节点的”path”按照指定的模式展现出现。这个函数只能使用在层次查询中。

下面的是oracle10g新增特性

2、 CONNECT_BY_ISLEAF

    在oracle9i的时候,查找指定root下的叶子节点,是很复杂的,oracle10g引入了一个新的函数,connect_by_isleaf,如果行的值为0表示不是叶子节点,1表示是叶子节点。

3、CONNECT_BY_ISCYCLE和NOCYCLE关键字

    如果从root节点开始找其子孙,找到一行,结果发生和祖先互为子孙的情况,则发生循环,oracle会报ORA-01436: CONNECT BY loop in user data,在9i中只能将发生死循环的不加入到树中或删除,在10g中可以用nocycle关键字加在connect by之后,避免循环的参加查询操作。并且通过connect_by_iscycle得到哪个节点发生循环。0表示未发生循环,1表示发生了循环。

4、CONNECT_BY_ROOT

    Oracle10g新增connect_by_root,用在列名之前表示此行的根节点的相同列名的值。

5、使用SIBLINGS关键字排序

    对于层次查询如果用order by排序,比如order by last_name则是先做完层次获得level,然后按last_name排序,这样破坏了层次,比如特别关注某行的深度,按level排序,也是会破坏层次的。

在oracle10g中,增加了siblings关键字的排序。

语法:order  siblings  by <expre>

它会保护层次,并且在每个等级中按expre排序。

oracle 递归层次查询相关推荐

  1. mysql递归层次查询

    mysql递归层次查询 最近在做一个从oracle数据库到mysql数据库的移植,遇到一个这样的问题 在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT B ...

  2. oracle层次查询用处,Oracle描述层次查询(hierarchicalquery)

    欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入 有关Oracle描述层次查询(hierarchical query)的详细情况,先看一张图: 正确答案:BD A错误,树 ...

  3. Mysql中的递归层次查询(父子查询)

    最近遇到了一个问题,在mysql中如何完成节点下的所有节点或节点上的所有父节点的查询? 在Oracle中我们知道有一个Hierarchical Queries可以通过CONNECT BY来查询,但是, ...

  4. Mysql中的递归层次查询(父子查询,无限极查询)

    前言:最近面试的时候遇到公司要求只能用SQL来查询无限极的数据,不能用PHP程序做递归查询,现在分享方法. 下面给出一个function来完成的方法 下面是sql脚本,想要运行的直接赋值粘贴进数据库即 ...

  5. oracle 自连接层次查询,使用自连接查询居然比直接查询效率高很多,何解?

    请newkid帮忙分析分析 自连接的: [php] 20:14:16 SQL> select t1.ind_cd f1,t2.ic f2 20:14:37   2  from places t1 ...

  6. Oracle 层次查询、递归

    Oracle 层次查询.递归 语法: select ... from tablename start with 条件1  connect by 条件2  where 条件3; 1. 树结构的描述  树 ...

  7. mysql start with connect by_MYSQL实现Oracle的Start with…Connect By递归树查询

    最近接触一个老项目,最初适配的数据库是oracle 后来迁移到mysql .这个迁移是由一个已经离职的新手做的.这个新手对于很多oracle特有的函数及存储过程都没有进行迁移.导致系统很多功能都BUG ...

  8. oracle 层次查询 connect by

    Hierarchical Queries 语法 connect by [nocycle] condition [start with condition] start with condition c ...

  9. oracle sql查询缺失号,Oracle层次查询和分析函数

    摘要 一组连续的数,去掉中间一些数,如何求出剩下的数的区间(即号段)?知道号段的起止,如何求出该号段内所有的数?知道一个大的号段范围和已经取过的号段,如何求出可用的号段?利用Oracle提供的强大的查 ...

最新文章

  1. 路由策略与策略路由的区别。
  2. python django 安装
  3. 支持Windows 7的CAD—AutoCAD Civil 3D 2010
  4. 1.%@Page%中的Codebehind、AutoEventWireup、Inherits有何作用?
  5. DP专练2 (大理石 + [ZJOI 2010]数字计数)
  6. 部分排序算法c语言实现
  7. ninjala服务器维护,Ninjala2.0版本更新内容一览
  8. 基于 Mean-shift的稳健性可视跟踪研究
  9. 行业揭秘:A股日内“T+0” 赚钱的方法
  10. 电磁铁基础知识介绍及各系列性能比较
  11. JSP页面请求和响应
  12. 压缩包文件的密码如何破解
  13. 现有论文和作者两个实体,论文实体的属性包括题目、期刊名称、年份、期刊号;作者实体的属性包括姓名、单位、地址;一篇论文可以有多个作者,且每一位作者写过多篇论文,在每一篇论文中有作者的顺序号。请完成以下操
  14. HTML5编写船上航行,描写帆船航行的诗句
  15. c语言strstr的使用及模拟实现strstr函数
  16. 重新认识康德的“头上星空”
  17. 抖音视频无水印下载工具 绿色版
  18. SOC FPGA linux系统搭建(Terasic DE10-Nano开发板)
  19. MySQL、Postgresql、Oracle常用SQL语句(主要演示下DDL的区别)
  20. video 标签设置样式

热门文章

  1. mac 不显示 外接屏幕_苹果电脑外接显示器显示不出来 - 卡饭网
  2. 公众号降权了可以养好嘛,微信公众号降权了多久能恢复
  3. 谷歌浏览器里部分字体变模糊的问题。
  4. 派森编程python_派森(Python)编程有什么用?
  5. ios查看苹果app的下载量,日活,销售情况等相关数据
  6. LeGO-LOAM 系列(1): LeGO-LOAM 安装以及概述
  7. Potplayer如何显示书签,书签编辑器
  8. 【软考】PV操作同步互斥
  9. python数字华容道算法_用React写一个数字华容道,你需要知道的秘密
  10. 情感日记:2009年12月24日平安夜—“马头琴”