【Oracle】Oracle语法之递归查询

打印 上一主题 下一主题

主题 527|帖子 527|积分 1581

递归查询



  • Oracle的递归查询是指在一个查询语句中利用自引用的方式举行循环迭代查询。
  • 它可以用于处置处罚具有条理结构的数据,如构造架构、产品种别等。
  • 递归查询通常利用WITH子句来定义递归查询的起始条件和终止条件,并利用UNION ALL运算符来连接递归查询的结果。
利用场景

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

  • 构造架构查询:递归查询可以用于查找构造架构的条理结构,例如查询某个员工的上级、部属或者全部部属。
  • 产品种别查询:递归查询可以用于查询产品种别的条理结构,例如查询某个种别的全部子种别或者找到某个产品所属的全部种别。
  • 树状结构查询:递归查询可以用于查询树状结构的条理关系,例如查询文件体系的目次结构、查询城市的层级关系等。
  • 图结构查询:递归查询可以用于查询图结构的相关信息,例如查询社交网络中某个人的朋侪列表、查询影戏的相关推荐等。
  • 日期范围查询:递归查询可以用于查询一个连续的日期范围内的数据,例如查询某个日期范围内的贩卖数据或者某个日期范围内的日志信息。
备注



  • 需要留意的是,在利用递归查询时要留意性能题目,特殊是当数据量较大时。
  • 为了避免性能题目,可以利用递归查询的剪枝功能、添加适当的索引或者利用其他优化本领来提升查询效率。
  • 此外,对于复杂的递归查询,可能需要思量利用存储过程或者递归SQL重写来优化查询性能。
语法

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



  • start with [condition]: 设置起点,用来限制第一层的数据,或者叫根节点数据;以这部分数据为基础来查找第二层数据,然后以第二层数据查找第三层数据以此类推。省略后默认以全部活动起点。
  • connect by [condition] : 用来指明在查找数据时以怎样的一种关系去查找;比如说查找第二层的数据时用第一层数据某个字段举行匹配,如果这个条件成立那么查找出来的数据就是第二层数据,同理往下递归匹配。
  • prior : 表示上一层级的标识符。常常用来对下一层级的数据举行限制。不可以接伪列。prior在等号前面和后面,查询的数据是不一样的
  • level : 伪列(关键字),代表树形结构中的层级编号(数字序列结果集),这个必须共同connect by利用,和rownum是同等效果。
  • connect_by_root : 表现根节点列。常常用来分组。
  • connect_by_isleaf : 1是叶子节点,0不是叶子节点。在制作树状表格时必用关键字。
  • sys_connect_by_path() : 将递归过程中的列举行拼接。
  • nocycle、connect_by_iscycle: 在有循环结构的查询中利用。
  • siblings : 保留树状结构,对兄弟节点举行排序。
案例

基本利用

假设我们要创建一个员工表,包含员工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的递归查询是一种强大的功能,可以用于处置处罚具有条理结构的数据(如构造架构、树形结构等)。
  • 递归查询基于CONNECT BY和PRIOR关键字,可以在SQL语句中实现递归的操纵。
在利用Oracle的递归查询时,需要留意以下几点:

  • 递归查询的起始条件:利用START WITH子句来指定递归查询的起始条件,即从哪个节点开始递归。
  • 递归查询的递归条件:利用CONNECT BY PRIOR子句来指定递归查询的递归条件,即怎样从一个节点递归到下一个节点。
  • 递归查询的属性:在递归查询中,可以利用CONNECT_BY_ROOT关键字来获取根节点的属性,利用LEVEL关键字来获取当前节点在条理结构中的级别。
  • 递归查询的排序:通过ORDER BY子句可以对递归查询的结果举行排序,可以按照根节点、级别等举行排序。
  • 递归查询的限制:在处置处罚大型数据集时,递归查询可能导致性能题目,可以通过设置递归查询的最大深度(MAXDEPTH)或者利用剪枝条件(PRUNE)来限制递归查询的范围。
递归查询在实际应用中有许多利用场景,例如处置处罚构造架构、查找树形结构的子节点或父节点、获取层级结构的路径等。通过公道利用递归查询,可以简化复杂的数据处置处罚操纵,提高查询效率和代码的可读性。

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

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

缠丝猫

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表