oracle 递归查询,Oracle SQL递归查询教程

在oracle 中可以通过使用start with … connect by prior … 实现递归查询。如果你对递归查询很

模糊了话,或许下面的示例将会帮助你更好的理解oracle SQL 递归查询。

一、manually 方式实现的递归查询。

SQL> select employee_id,last_name,first_name,manager_id

2 from employees

3 where manager_id is null;

EMPLOYEE_ID LAST_NAME FIRST_NAME MANAGER_ID

———– ————– ————– ———-

100 King Steven

通过where 子句中的 manager_id is null 来确定一个递归查询的起点。

SQL> select employee_id,last_name,first_name,manager_id

2 from employees

3 where manager_id = 100;

EMPLOYEE_ID LAST_NAME FIRST_NAME MANAGER_ID

———– ————– ————– ———-

101 Kochhar Neena 100

102 De Haan Lex 100

114 Raphaely Den 100

120 Weiss Matthew 100

121 Fripp Adam 100

122 Kaufling Payam 100

123 Vollman Shanta 100

124 Mourgos Kevin 100

145 Russell John 100

146 Partners Karen 100

147 Errazuriz Alberto 100

EMPLOYEE_ID LAST_NAME FIRST_NAME MANAGER_ID

———– ————– ————– ———-

148 Cambrault Gerald 100

149 Zlotkey Eleni 100

201 Hartstein Michael 100

14 rows selected.

查询manager_id = 100 的雇员有那些,得到了一个结果集,oracle将会在这个结果集的基础上处理

这个结果集中的没一条记录,处理的方式和上面的方式是相同的,直到不能在进行递归下去了,处理

的流程将会返回到这个结果集中去取下一条记录要处理,如此反复直到把这个结果集中的每条记录都

处理完,最后返回给用户最终的结果集。

二、使用start with … connect by … 实现的递归查询。

SQL> ed

Wrote file afiedt.buf

1 select lpad(‘ ‘,level*2,’ ‘)||employee_id as emp_id,last_name,first_name,manager_id

2 from employees–level 指递归的深度。根节点为1,根据深度不断的自增1.这里用来控制缩进。

3 start with manager_id is null –指定递归查询中的根节点(开始节点)。

4 connect by prior employee_id = manager_id–prior 表示前面查询的结果集中的employee_id与当前查询中的manager_id 匹配。

5* order by emp_id desc

SQL> /

EMP_ID LAST_NAME FIRST_NAME MANAGER_ID

———————— ————– ————– ———-

100 King Steven

201 Hartstein Michael 100

149 Zlotkey Eleni 100

148 Cambrault Gerald 100

147 Errazuriz Alberto 100

146 Partners Karen 100

145 Russell John 100

124 Mourgos Kevin 100

123 Vollman Shanta 100

122 Kaufling Payam 100

121 Fripp Adam 100

EMP_ID LAST_NAME FIRST_NAME MANAGER_ID

———————— ————– ————– ———-

120 Weiss Matthew 100

114 Raphaely Den 100

102 De Haan Lex 100

101 Kochhar Neena 100

205 Higgins Shelley 101

204 Baer Hermann 101

203 Mavris Susan 101

202 Fay Pat 201

200 Whalen Jennifer 101

199 Grant Douglas 124

198 OConnell Donald 124

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值