在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