oracle start with connect by order siblings by用法
如果表中包含层级数据,那么你就可以使用层级查询从句选择行层级顺序。
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 实际场景:
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中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 子句,改变查询结果的显示顺序,而不必按照遍历树结构的顺序
在层次查询中,如果想让“亲兄弟”按规矩进行升序排序就不得不借助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用法相关推荐
- oracle 数据库中 connect by 和level 的用法
这几天看sql看到了有关connect by和level的关键字用法,以前都用mysql也没用过这个关键字,感觉挺有用的,就学了下,整理一下学习过程. 首先,connect by和level都是为了快 ...
- oracle 层次查询 connect by
Hierarchical Queries 语法 connect by [nocycle] condition [start with condition] start with condition c ...
- Oracle递归查询,Oracle START WITH……CONNECT BY查询
Oracle递归查询,Oracle START WITH--CONNECT BY查询,Oracle树查询 ================================ ©Copyright 蕃薯耀 ...
- oracle until freed,Oracle中报错Connect internal only, until freed
Oracle中报错Connect internal only, until freed属于归档日志满了. 有两种方法可以解决,第一种是删除归档日志,第二种是增大闪回日志文件的最大大小 SQL> ...
- Oracle 外连接和 (+)号的用法
Oracle 外连接和 (+)号的用法 转自:http://www.cnblogs.com/iloveu/archive/2009/08/04/1538781.html 对于外连接,Oracle中可以 ...
- Apache中的Order Allow,Deny用法详解
本文讲述了Apache中的Order Allow,Deny用法.分享给大家供大家参考,具体如下: Allow和Deny可以用于apache的conf文件或者.htaccess文件中(配合Directo ...
- group by 与 order by的用法
group by 与 order by的用法 GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组. SQL GROUP BY 语法 SELECT column_name, agg ...
- oracle正则判断纯数字,oracle 判断字段是否为是数字 regexp_like用法 正则表达式
oracle 判断字段是否为是数字regexp_like用法正则表达式ORACLT TNND 2010-07-15 10:12:28 阅读303 评论0 字号:大中小订阅 /* ORACLE中的支持正 ...
- ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法
ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法 今天在使用多字段去重时,由于某些字段有多种
- 转 ORACLE CASE WHEN 及 SELECT CASE WHEN的用法
原址如下: http://exceptioneye.iteye.com/blog/1197329 ORACLE CASE WHEN 及 SELECT CASE WHEN的用法 Case具有两种格式.简 ...
最新文章
- Fiddler使用技巧:强大的数据文本编解码功能
- js中==与===的区别
- 算法提高课-图论-单源最短路的建图方式-AcWing 1126. 最小花费:dijkstra求最长路
- python 文件操作 os 如何检索文件夹内文件数量
- android 9格式吗,Android Studio中关于9-patch格式图片的编译错误
- mac的 上传到linux服务器地址,【mac 怎么登录到 linux 服务器并传输文件?】-看准网...
- smith圆图重要性_数学之美:浅谈Smith圆图
- Navicat Premium 12注册机破解方法
- Web:6 大主流 Web 框架优缺点对比之Ember
- 项目经理的修炼,直面需求变更
- 搅拌站特征码序列号_芝奇的特征码与颗粒的命名规则
- 软件测试自动感应灯,原来这么简单——四种常见LED感应灯工作原理
- 14.Nor-Flash操作实例
- 《冰河世纪》特效指导罗皓做客【ftrack聊天室】
- doctrine2 mysql_php – Doctrine2和MySQL分区
- MATLAB加柯西分布噪声图像和加柯西分布噪声图像直方图
- 燕千云知识库,解决你的知识沉淀烦恼
- YOLOv5推理详解及预处理高性能实现
- 图像去燥:NLM、BM3D
- javascript获取某一年至当年的年份数组的方法
热门文章
- 市场营销学3——市场营销环境
- quick Cocos2dx lua 接anysdk
- android pc控制工具,电脑控制iPhone 或Android方法?透过这款工具就能实现
- 推荐几个常用常玩的小游戏网址包括4399.com
- esp32测试wifi速率
- H5支付(支付宝)开通流程
- js每日一题(11)
- 怎么选择外贸邮箱,收费企业邮箱大全
- 关于Entity FrameWork获取插入后的自增ID
- Browserslist: caniuse-lite is outdated. Please run the following command: `npm update`