基于ORACLE的SQL怎么编写推移图
时间: 2024-03-03 14:49:32 浏览: 10
推移图(Transitive Closure Graph)是一个基于关系型数据库的图形结构,它可以表示数据库中所有可能的关系。在ORACLE数据库中,可以使用递归查询(Recursive Query)来生成推移图。
假设我们有一个表格`employee`,其中包含雇员的ID和直接上级的ID,如下所示:
```
employee_id | manager_id
-------------|-------------
1 | null
2 | 1
3 | 2
4 | 2
5 | 3
6 | 4
```
现在我们想要生成所有雇员之间的直接或间接上下级关系,可以使用以下SQL语句:
```sql
WITH recursive employee_tree (employee_id, manager_id, level) AS (
-- 基础查询
SELECT employee_id, manager_id, 0
FROM employee
WHERE manager_id IS NULL
UNION ALL
-- 递归查询
SELECT e.employee_id, e.manager_id, et.level + 1
FROM employee e
JOIN employee_tree et ON e.manager_id = et.employee_id
)
SELECT *
FROM employee_tree;
```
以上SQL语句使用了`WITH`子句和`recursive`关键字来定义一个递归查询,其中`employee_tree`是一个递归查询的结果集,包含每个雇员的ID、直接上级的ID和层级。在基础查询中,我们选择了没有上级的雇员,作为递归查询的起点;在递归查询中,我们将`employee`表关联到`employee_tree`中,以便获取每个雇员的直接下属。最终,我们通过查询`employee_tree`来获取所有雇员之间的直接或间接上下级关系。
执行以上SQL语句的结果如下:
```
employee_id | manager_id | level
-------------|-------------|--------
1 | null | 0
2 | 1 | 1
3 | 2 | 2
4 | 2 | 2
5 | 3 | 3
6 | 4 | 3
```
以上结果表示,雇员1是所有雇员的根节点,它没有上级;雇员2是雇员1的直接下属,它的下属是雇员3和雇员4;雇员3和雇员4都是雇员2的直接下属,它们的下属分别是雇员5和雇员6。