Oracle的递归查询

概念定义Definition

官方11c参考地址:Hierarchical Queries
https://docs.oracle.com/cd/E11882_01/server.112/e41084/queries003.htm#SQLRF52332
公式:

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

公式图解:

hierarchical_query_clause.gif

condition的写法

... PRIOR expr1 = expr2
or
... expr2 = PRIOR expr1

CONNECT BY condition 是完整的一组,而PRIOR也是必须的一元操作符。

PRIOR 表示当前行此列值为父节点,PRIOR后跟的可以是具体的列也可以是表达式。

举例说明Example

我们假设一张表table,id字段是主键,值从1到12。pid字段是外键代表父层id。假如继承结构如下图:

Oracle的递归查询_第1张图片
sqlrf002.gif

自上而下递归

当前节点是父节点,寻找所有子节点。如图我们从2找到3、4、5、6

select id, pid from table
start with id = 2
connect by prior id = pid;

id=2这一行是父节点,所以prior 修饰id,而pid代表下一个节点的外键并且等于本节点的id

那么查询结果如下:

id pid

2 1

3 2

4 2

5 4

6 4

思考题:如果2有两个父节点会怎么样,如果更多个呢?

自下而上递归

当前节点是子节点,寻找所有父节点。如图我们从5开始找到4、2、1

select id, pid from table
start with id = 5
connect by prior pid = id;

id=5这一行是子节点,所以prior修饰pid,而id代表下一节点的主键并且等于本节点的pid

那么查询结果如下:

id pid

5 4

4 2

2 1

思考题:如果5有两个上级甚至多个上级会怎么样,如果5的所有上级中有交叉又会怎么样?如果5有多个下级会不会对查询效果有影响?

下面再送一个智力题:

有两根不均匀分布的香,香烧完的时间是一个小时,你能用什么方法来确定一段15分钟的时间?

关注公众号“鬼马双星”,回复“烧香”获得答案

Oracle的递归查询_第2张图片
鬼马双星

你可能感兴趣的:(Oracle的递归查询)