您的位置:首页 > 数据库 > Oracle

oracle start with connect by 中prior的使用

2017-04-24 22:16 525 查看
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: 返回一个从根节点到该节点的字符串.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: