Oracle 中使用connect by 来进行分层查询, 查询是可设置 起始行,即roots(start with clause), 若不设置,
所有行都将看做是root. 一个简单的例子如下:
SELECT employee_id, last_name, manager_id, LEVEL FROM employees CONNECT BY PRIOR employee_id = manager_id;
LEVEL 为伪列, 表示该行所处的层次, root为1.
其中较为难掌握的应该就是prior的使用了.
官方文档如下:
[start with condition1] connect by [nocycle] condition2
in a hierarchical query, one expression in condition must be qualified with the prior operator to refer
to the parent row.
也就是说, connect by 中prior 毗邻的column会作为父行的标志(父行通过start with 确定), 然后判断其他行的(等号对面的column)是否相等,如同相等, 作为它的子行, 同时level伪列+1, 递归进行搜索.
如下:
SELECT employee_id, last_name, manager_id
FROM employees
CONNECT BY PRIOR employee_id = manager_id;
EMPLOYEE_ID LAST_NAME MANAGER_ID
----------- ------------------------- ----------
101 Kochhar 100
108 Greenberg 101
109 Faviet 108
110 Chen 108
111 Sciarra 108
112 Urman 108
113 Popp 108
200 Whalen 101
...
该SQL语句中, prior 在employee_id 附近, 因此 employee_id作为 父行的标志, 搜索其他行manager_id等于此行employee_id的行.
此外, 至Oracle 11g, Oracle提供了以下伪列和方法
connect_by_isleaf : 返回1若该行是叶节点, 表明该行不能继续扩展而得到更多的层级.
connect_by_root: 此为一元操作符, 后面跟根节点的一个列
connect_by_iscycle: 配合 nocycle使用, 返回1, 若此行开始了一个循环
sys_connect_by_path: 返回一个从根节点到该节点的字符串.
本文介绍Oracle数据库中使用connect by进行分层查询的方法。通过实例展示了如何利用伪列LEVEL标识层级,并解释了prior关键字的作用及connect_by_isleaf、connect_by_root等伪列的功能。
2643

被折叠的 条评论
为什么被折叠?



