ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【Oracle】Oracle语法之递归查询 [打印本页]

作者: 缠丝猫    时间: 2024-9-13 03:25
标题: 【Oracle】Oracle语法之递归查询
递归查询


利用场景

递归查询在以下场景中常常被利用:
备注


语法

  1. SELECT * FROM TABLE WHERE 条件3 START WITH 条件1 CONNECT BY 条件2;
复制代码
相关属性表明


案例

基本利用

假设我们要创建一个员工表,包含员工ID、姓名和上级ID字段。我们可以按照以下方式创建表结构并插入一些数据:
  1. CREATE TABLE employees (
  2.     employee_id NUMBER,
  3.     name VARCHAR2(50),
  4.     manager_id NUMBER
  5. );
  6. INSERT INTO employees VALUES (1, 'Alice', NULL);
  7. INSERT INTO employees VALUES (2, 'Bob', 1);
  8. INSERT INTO employees VALUES (3, 'Charlie', 2);
  9. INSERT INTO employees VALUES (4, 'Dave', 2);
  10. INSERT INTO employees VALUES (5, 'Eve', 1);
复制代码
现在我们可以编写两个递归查询,一个向上查找某个员工的全部上级,一个向下查找某个员工的全部下级。
向上递归查询可以利用CONNECT BY PRIOR关键字:
  1. -- 向上递归查询
  2. SELECT employee_id, name
  3. FROM employees
  4. START WITH name = 'Charlie' -- 起始条件
  5. CONNECT BY PRIOR manager_id = employee_id -- 递归条件
  6. ORDER BY level DESC;
复制代码
结果将返回:
  1. EMPLOYEE_ID | NAME
  2. -----------------
  3. 1            Alice
  4. 2            Bob
  5. 3            Charlie
复制代码
向下递归查询可以利用CONNECT BY关键字:
  1. -- 向下递归查询
  2. SELECT employee_id, name
  3. FROM employees
  4. START WITH name = 'Alice' -- 起始条件
  5. CONNECT BY PRIOR employee_id = manager_id -- 递归条件
  6. ORDER BY level;
复制代码
结果将返回:
  1. EMPLOYEE_ID | NAME
  2. -----------------
  3. 1            Alice
  4. 2            Bob
  5. 3            Charlie
  6. 4            Dave5            Eve
复制代码
这样,我们就可以通过递归查询在员工表中向上或向下查找员工的上级或下级关系。
升级版-带上递归查询的属性

假设我们要创建一个部门表,包含部门ID、部门名称和上级部门ID字段。我们可以按照以下方式创建表结构并插入一些数据:
  1. CREATE TABLE departments (
  2.     department_id NUMBER,
  3.     department_name VARCHAR2(50),
  4.     parent_department_id NUMBER
  5. );
  6. INSERT INTO departments VALUES (1, 'Sales', NULL);
  7. INSERT INTO departments VALUES (2, 'Marketing', 1);
  8. INSERT INTO departments VALUES (3, 'Finance', 1);
  9. INSERT INTO departments VALUES (4, 'Operations', NULL);
  10. INSERT INTO departments VALUES (5, 'Advertising', 2);
复制代码
现在我们可以编写一个递归查询,查找某个部门的全部下级部门,并包含递归查询的属性。
  1. -- 递归查询部门及其下级部门
  2. SELECT CONNECT_BY_ROOT department_id AS root_department_id,
  3.        d.department_id,
  4.        d.department_name,
  5.        d.parent_department_id,
  6.        LEVEL
  7. FROM departments d
  8. START WITH department_id = 1 -- 起始条件
  9. CONNECT BY PRIOR department_id = parent_department_id -- 递归条件
  10. ORDER BY root_department_id, LEVEL;
复制代码
结果将返回:
  1. ROOT_DEPARTMENT_ID | DEPARTMENT_ID | DEPARTMENT_NAME | PARENT_DEPARTMENT_ID | LEVEL
  2. -----------------------------------------------------------------------------------
  3. 1                   1               Sales             null                   1
  4. 1                   2               Marketing         1                      2
  5. 1                   5               Advertising       2                      3
  6. 1                   3               Finance           1                      2
  7. 4                   4               Operations        null                   1
复制代码
在查询结果中,ROOT_DEPARTMENT_ID代表根部门的ID,DEPARTMENT_ID代表当前部门的ID,DEPARTMENT_NAME代表当前部门的名称,PARENT_DEPARTMENT_ID代表当前部门的上级部门ID,LEVEL代表当前部门在层级结构中的级别。
这样,我们可以通过递归查询在部门表中查找某个部门的全部下级部门,并获得相关属性的信息。
总结:


在利用Oracle的递归查询时,需要留意以下几点:
递归查询在实际应用中有许多利用场景,例如处置处罚构造架构、查找树形结构的子节点或父节点、获取层级结构的路径等。通过公道利用递归查询,可以简化复杂的数据处置处罚操纵,提高查询效率和代码的可读性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4