oracle递归
时间: 2023-07-04 16:22:02 浏览: 177
Oracle递归查询
Oracle中的递归可以通过使用`WITH`子句和`CONNECT BY`子句来实现。这种递归查询方式被称为“递归公共表达式(Recursive Common Table Expression)”。
下面是一个简单的递归查询的例子,假设我们有一个员工表`EMP`,其中有一个字段`MGR`表示员工的上级经理:
```
EMPNO ENAME JOB MGR
1 John Manager NULL
2 Bob Clerk 1
3 Alice Clerk 1
4 Tom Analyst 2
5 Mary Analyst 3
6 Jack Salesman 1
```
我们可以使用递归查询来查找每个员工的所有下属,包括直接下属和间接下属。下面是一个使用递归查询的示例:
```
WITH emp_tree AS (
SELECT empno, ename, job, mgr, 0 AS level
FROM emp
WHERE mgr IS NULL
UNION ALL
SELECT emp.empno, emp.ename, emp.job, emp.mgr, emp_tree.level + 1
FROM emp_tree
JOIN emp ON emp.mgr = emp_tree.empno
)
SELECT empno, ename, job, level
FROM emp_tree
ORDER BY level, empno;
```
在上面的查询中,我们首先定义了一个递归公共表达式`emp_tree`,它包含了所有顶级经理的信息。然后我们使用`UNION ALL`运算符将顶级经理和他们的直接下属组合在一起,并将`level`设置为0。接下来,我们使用`JOIN`运算符将每个下属与其直接上级经理连接起来,并将`level`设置为上级经理的`level + 1`。最后,我们从递归公共表达式`emp_tree`中选择所有下属的信息,并按照`level`和`empno`排序。
执行以上查询的结果如下:
```
EMPNO ENAME JOB LEVEL
---- ------ --------- -----
1 John Manager 0
2 Bob Clerk 1
3 Alice Clerk 1
6 Jack Salesman 1
4 Tom Analyst 2
5 Mary Analyst 2
```
在这个结果中,我们可以看到每个员工的编号、姓名、职位和级别。其中,顶级经理的级别为0,直接下属的级别为1,间接下属的级别为2。
阅读全文