如果表中包含层级数据,那么你就可以使用层级查询从句选择行层级顺序。

1.层级查询从句语法

层级查询从句语法:

{ CONNECT BY [ NOCYCLE ] condition [AND condition]... [ START WITH condition ]
| START WITH condition CONNECT BY [ NOCYCLE ] condition [AND condition]...
}

START WITH:指定层级的跟节点行。

CONNECT BY:指定层级的父行于子行的关系。

  • NOCYCLE参数指示Oracle数据库查询返回行,即使CONNECT BY在数据中存在循环。通常与CONNECT_BY_ISCYCLE伪列一起使用查看行是否包含循环。
  • 在层级查询中,表达式的条件必须使用PRIOR运算符加以限定来查询父行,例如:

... PRIOR expr = expr
         or
         ... expr = PRIOR expr

如果CONNECT BY的条件是复合条件,只有一个条件PRIOR运算符是必须的,然而可以有多个PRIOR条件。例如:

CONNECT BY last_name != 'King' AND PRIOR employee_id = manager_id ...
      CONNECT BY PRIOR employee_id = manager_id and
                             PRIOR account_mgr_id = customer_id ...

PRIOR是一个一元运算符和一元+-算术运算符具有相同的优先级。PRIOR根据层级查询中的表达式立刻计算出当前行的父行。

PRIOR必须与比较列值的相等运算符一起使用(PRIOD关键字可以相等运算符的任意一边)。

CONNECT BY条件和PRIOD表达两者之间形成一个不相关的子查询结构。因此CURRVAL和NEXTVAL是无效的PRIOR表达式,所以PRIOR表达不能用于查询序列。

通过使用CONNECT_BY_ROOT运算符来限定在查询列表中的列,可以进一步细化层级查询。这个运算符扩展了层级查询CONNECT BY [PRIOR]条件的功能,不仅立即返回父行,而且还返回层次结构中的所有行根节点行。

2.层级查询伪列

层级查询伪列只有在层级查询中是有效的,层级查询伪列:

2.1.CONNECT_BY_ISCYCLE伪列

如果当前行有一个子行,且子行又是当前行的祖先行,CONNECT_BY_ISCYCLE返回1,否则返回0.

只有在CONNECT BY从句中指定了NOCYCLE参数,才能指定CONNECT_BY_ISCYCLE。由于CONNECT BY存在循环数据,NOCYCLE能使Oracle返回查询结果,否则将查询失败。

2.2.CONNECT_BY_ISLEAF伪列

如果当前行是CONNECT BY条件定义树的叶子节点,CONNECT_BY_ISLEAF伪列返回1,否则返回0。该信息也表明了一个给定的行是否可以进一步扩张,表现出更多的层次。

2.3.LEVEL伪列

层级查询返回的每一行,跟节点行LEVEL伪列返回1,跟节点的子节点行LEVEL为例返回2等等。跟节点行是倒置树的最高行。子节点行是任意非跟节点行。父节点行是任意有子节点的行。叶子节点行是任意没有子节点行。

2.4 ORDER SIBLINGS BY

        按照层级结构进行排序。

3 实际场景:

1)定了一张树形结构表,包括节点ID,父节点ID,还有每个LEVLE中的排序。我们要查询出这些元素,按照树形结构顺序遍历的结果。
 SELECT A.ITEM_NODE_NAME, A.FIELD_ID ,A.*
      FROM CA_BILL_FORMAT_MULTILEVEL A
      WHERE A.BILL_FORMAT_ID = 10
     START WITH A.PARENT_NODE_ID = 0
    CONNECT BY PRIOR A.ITEM_NODE_ID=A.PARENT_NODE_ID
     ORDER SIBLINGS BY A.SORT_ID
3)想打印出每个树形结构,具体的分支走向
select lpad(' ',level-1)||Item_node_id,sys_connect_by_path(item_node_id,'/') from ad.CA_BILL_FORMAT_MULTILEVEL A
where a.bill_format_id=10
connect by prior a.item_node_id=a.parent_node_id
order siblings by a.sort_id;
2)某个表,并非设计成了树形结构,但我们可以利用递归的方式,查询出满足特定递归条件的数据。比如递增、递减、保持不变等。
SQL> select distinct  msisdn  from test  a
2  where  bill_month='200803'
3  and exists
4  ( select msisdn from  test
5    where  bill_month='200803' and msisdn=a.msisdn
6    start with day_number=a.day_number
7    connect by  prior day_number=day_number-1 and prior msisdn= msisdn
8    group by msisdn
9    having count(*)>=3
10    );
oracle中 connect by prior 递归算法

Oracle中start with...connect by prior子句用法 connect by 是结构化查询中用到的,其基本语法是: 
select ... from tablename start with 条件1 
connect by 条件2 
where 条件3; 
例: 
select * from table 
start with org_id = 'HBHqfWGWPy' 
connect by prior org_id = parent_id;

简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段: 
org_id,parent_id那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。 
     用上述语法的查询可以取得这棵树的所有记录。 
     其中: 
     条件1 是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。 
     条件2 是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR org_id = parent_id就是说上一条记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录。 
     条件3 是过滤条件,用于对返回的所有记录进行过滤。

简单介绍如下: 
     早扫描树结构表时,需要依此访问树结构的每个节点,一个节点只能访问一次,其访问的步骤如下: 
     第一步:从根节点开始; 
     第二步:访问该节点; 
     第三步:判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节,并执行第二步,否则执行第四步; 
     第四步:若该节点为根节点,则访问完毕,否则执行第五步; 
     第五步:返回到该节点的父节点,并执行第三步骤。

总之:扫描整个树结构的过程也即是中序遍历树的过程。

1. 树结构的描述 
树结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列间的关系来描述,如EMP表中的EMPNO和MGR。EMPNO表示该雇员的编号,MGR表示领导该雇员的人的编号,即子节点的MGR值等于父节点的EMPNO值。在表的每一行中都有一个表示父节点的MGR(除根节点外),通过每个节点的父节点,就可以确定整个树结构。 
在SELECT命令中使用CONNECT BY 和蔼START WITH 子句可以查询表中的树型结构关系。其命令格式如下: 
SELECT 。。。 
CONNECT BY {PRIOR 列名1=列名2|列名1=PRIOR 裂名2} 
[START WITH]; 
其中:CONNECT BY子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。PRIORY运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,PRIOR运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达式。START WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。 
START WITH: 不但可以指定一个根节点,还可以指定多个根节点。 
2. 关于PRIOR 
运算符PRIOR被放置于等号前后的位置,决定着查询时的检索顺序。 
PRIOR被置于CONNECT BY子句中等号的前面时,则强制从根节点到叶节点的顺序检索,即由父节点向子节点方向通过树结构,我们称之为自顶向下的方式。如: 
CONNECT BY PRIOR EMPNO=MGR 
PIROR运算符被置于CONNECT BY 子句中等号的后面时,则强制从叶节点到根节点的顺序检索,即由子节点向父节点方向通过树结构,我们称之为自底向上的方式。例如: 
CONNECT BY EMPNO=PRIOR MGR 
在这种方式中也应指定一个开始的节点。 
3. 定义查找起始节点 
     在自顶向下查询树结构时,不但可以从根节点开始,还可以定义任何节点为起始节点,以此开始向下查找。这样查找的结果就是以该节点为开始的结构树的一枝。 
4.使用LEVEL 
在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为1,根节点的子节点为2, 依此类推。 
5.节点和分支的裁剪 
在对树结构进行查询时,可以去掉表中的某些行,也可以剪掉树中的一个分支,使用WHERE子句来限定树型结构中的单个节点,以去掉树中的单个节点,但它却不影响其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时)。 
6.排序显示 
象在其它查询中一样,在树结构查询中也可以使用ORDER BY 子句,改变查询结果的显示顺序,而不必按照遍历树结构的顺序

原文地址 http://space.itpub.net/519536/viewspace-624176

在层次查询中,如果想让“亲兄弟”按规矩进行升序排序就不得不借助ORDERSIBLINGS BY这个特定的排序语句,若要降序输出可以在其后添加DESC关键字。
通过这个实验给大家展示一下这个“亲兄弟”间的排序功能。

1.回望关系“树”,这棵树中的B和C是亲兄弟,F和G是亲兄弟。注意,D和E不是亲兄弟,最多也就算是堂兄弟,“亲兄弟排序”功能对他们无效。
     A
    / \
   B   C
  /   /
  D  E
 / \
F   G

2.重温一下阐述上图的T表数据
sec@ora10g> select * from t;

X                  Y         Z
---------- ---------- ----------
A                  1
B                  2         1
C                  3         1
D                  4         2
E                  5         3
F                  6         4
G                  7         4

7 rows selected.

3.我们对X列使用“ORDER SIBLINGS BY”进行升序排序,重点关注B和C、F和G的顺序。
sec@ora10g> select lpad(' ',level-1)||x tree, SYS_CONNECT_BY_PATH(x,'/') tree_path from t start with x = 'A' connect by prior y=z order siblings by x;

TREE            TREE_PATH
---------------- ----------------
A               /A
 B              /A/B
 D             /A/B/D
  F            /A/B/D/F
  G            /A/B/D/G
 C              /A/C
 E             /A/C/E

7 rows selected.

4.我们对X列使用“ORDER SIBLINGS BY DESC”进行降序排序,重点关注B和C、F和G的顺序。
sec@ora10g> select lpad(' ',level-1)||x tree, SYS_CONNECT_BY_PATH(x,'/') tree_path from t start with x = 'A' connect by prior y=z order siblings by x desc;

TREE            TREE_PATH
---------------- ----------------
A               /A
 C              /A/C
 E             /A/C/E
 B              /A/B
 D             /A/B/D
  G            /A/B/D/G
  F            /A/B/D/F

7 rows selected.

5.如在层次查询中错误的使用了“ORDER BY”进行排序,则层次查询中蕴含的遍历顺序将被打乱,剩下的将只是信息的罗列。
sec@ora10g> select lpad(' ',level-1)||x tree, SYS_CONNECT_BY_PATH(x,'/') tree_path from t start with x = 'A' connect by prior y=z order by x;

TREE            TREE_PATH
---------------- ----------------
A               /A
 B              /A/B
 C              /A/C
 D             /A/B/D
 E             /A/C/E
  F            /A/B/D/F
  G            /A/B/D/G

7 rows selected.

6.小结
具体问题具体分析,特殊场合特出方法。在层次查询中如需对亲兄弟的先后顺序进行限定,就必须要使用特有的“ORDER SIBLINGS BY”而非“ORDER BY”子句。切记之。

oracle start with connect by order siblings by用法相关推荐

  1. oracle 数据库中 connect by 和level 的用法

    这几天看sql看到了有关connect by和level的关键字用法,以前都用mysql也没用过这个关键字,感觉挺有用的,就学了下,整理一下学习过程. 首先,connect by和level都是为了快 ...

  2. oracle 层次查询 connect by

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

  3. Oracle递归查询,Oracle START WITH……CONNECT BY查询

    Oracle递归查询,Oracle START WITH--CONNECT BY查询,Oracle树查询 ================================ ©Copyright 蕃薯耀 ...

  4. oracle until freed,Oracle中报错Connect internal only, until freed

    Oracle中报错Connect internal only, until freed属于归档日志满了. 有两种方法可以解决,第一种是删除归档日志,第二种是增大闪回日志文件的最大大小 SQL> ...

  5. Oracle 外连接和 (+)号的用法

    Oracle 外连接和 (+)号的用法 转自:http://www.cnblogs.com/iloveu/archive/2009/08/04/1538781.html 对于外连接,Oracle中可以 ...

  6. Apache中的Order Allow,Deny用法详解

    本文讲述了Apache中的Order Allow,Deny用法.分享给大家供大家参考,具体如下: Allow和Deny可以用于apache的conf文件或者.htaccess文件中(配合Directo ...

  7. group by 与 order by的用法

    group by 与 order by的用法 GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组. SQL GROUP BY 语法 SELECT column_name, agg ...

  8. oracle正则判断纯数字,oracle 判断字段是否为是数字 regexp_like用法 正则表达式

    oracle 判断字段是否为是数字regexp_like用法正则表达式ORACLT TNND 2010-07-15 10:12:28 阅读303 评论0 字号:大中小订阅 /* ORACLE中的支持正 ...

  9. ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法

    ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法      今天在使用多字段去重时,由于某些字段有多种

  10. 转 ORACLE CASE WHEN 及 SELECT CASE WHEN的用法

    原址如下: http://exceptioneye.iteye.com/blog/1197329 ORACLE CASE WHEN 及 SELECT CASE WHEN的用法 Case具有两种格式.简 ...

最新文章

  1. Fiddler使用技巧:强大的数据文本编解码功能
  2. js中==与===的区别
  3. 算法提高课-图论-单源最短路的建图方式-AcWing 1126. 最小花费:dijkstra求最长路
  4. python 文件操作 os 如何检索文件夹内文件数量
  5. android 9格式吗,Android Studio中关于9-patch格式图片的编译错误
  6. mac的 上传到linux服务器地址,【mac 怎么登录到 linux 服务器并传输文件?】-看准网...
  7. smith圆图重要性_数学之美:浅谈Smith圆图
  8. Navicat Premium 12注册机破解方法
  9. Web:6 大主流 Web 框架优缺点对比之Ember
  10. 项目经理的修炼,直面需求变更
  11. 搅拌站特征码序列号_芝奇的特征码与颗粒的命名规则
  12. 软件测试自动感应灯,原来这么简单——四种常见LED感应灯工作原理
  13. 14.Nor-Flash操作实例
  14. 《冰河世纪》特效指导罗皓做客【ftrack聊天室】
  15. doctrine2 mysql_php – Doctrine2和MySQL分区
  16. MATLAB加柯西分布噪声图像和加柯西分布噪声图像直方图
  17. 燕千云知识库,解决你的知识沉淀烦恼
  18. YOLOv5推理详解及预处理高性能实现
  19. 图像去燥:NLM、BM3D
  20. javascript获取某一年至当年的年份数组的方法

热门文章

  1. 市场营销学3——市场营销环境
  2. quick Cocos2dx lua 接anysdk
  3. android pc控制工具,电脑控制iPhone 或Android方法?透过这款工具就能实现
  4. 推荐几个常用常玩的小游戏网址包括4399.com
  5. esp32测试wifi速率
  6. H5支付(支付宝)开通流程
  7. js每日一题(11)
  8. 怎么选择外贸邮箱,收费企业邮箱大全
  9. 关于Entity FrameWork获取插入后的自增ID
  10. Browserslist: caniuse-lite is outdated. Please run the following command: `npm update`