Oracle 11GR2的递归WITH子查询方法

yizhihongxing

递归WITH子查询是Oracle 11GR2版本引入的一种新特性。可以帮助我们解决很多树形数据模型的查询问题。下面是本文的详细攻略。

什么是递归WITH子查询

递归WITH子查询是一种特殊的SQL语句形式,它能够以递归的方式访问一个自引用的查询(即一个查询结果集中的某个列或几列引用了同一表中的其它行)。

递归WITH子查询通常用于查询树形结构的数据,比如组织架构、家族关系等。通过递归WITH子查询,我们可以轻松地查询父节点、子节点、兄弟节点等信息。

递归WITH子查询的语法

递归WITH子查询的语法如下所示:

WITH recursive_query_name (column_list) AS (
  initial_query
  UNION [ALL]
  recursive_query
) SELECT * FROM recursive_query_name;

其中,

  • recursive_query_name:递归查询的名称。
  • column_list:递归查询返回的列列表,列名可以自行定义。
  • initial_query:递归查询的初始查询,一般用来输出跟结点信息。
  • UNION [ALL]:递归关键字,ALL表示保留重复结果。
  • recursive_query:递归查询,该查询的结果集包含一个或多个基于先前结果集行的递归关系。
  • SELECT:最终查询。

递归WITH子查询的实际应用

假如我们有一个员工表,包含员工编号、员工姓名、上级编号等字段。我们需要查询某个员工的所有上级,包括该员工自己。可以使用如下的递归WITH子查询:

WITH recursive_query_name (empno, ename, mgr) AS (
  SELECT empno, ename, mgr FROM emp WHERE empno = 7934
  UNION ALL
  SELECT e.empno, e.ename, e.mgr FROM emp e
  INNER JOIN recursive_query_name r ON r.mgr = e.empno
) SELECT * FROM recursive_query_name;

上述SQL语句中,

  • 初始查询是SELECT empno, ename, mgr FROM emp WHERE empno = 7934,表示查询初始员工信息。
  • 递归查询是SELECT e.empno, e.ename, e.mgr FROM emp e INNER JOIN recursive_query_name r ON r.mgr = e.empno,表示查询该员工的下一个上级。

执行上述SQL语句,得到的结果集包含了该员工的所有上级,包括该员工自己。

递归WITH子查询的实例说明

下面再给出一个实例说明。假如我们有一个无向图,要求求出从某个结点开始能达到的所有结点。我们可以使用如下的递归WITH子查询:

WITH RECURSIVE recursive_query_name (node_from, node_to, depth) AS (
  SELECT node_from, node_to, 1 FROM my_graph WHERE node_from = 'a'
  UNION
  SELECT g.node_from, g.node_to, r.depth + 1 from my_graph g
  INNER JOIN recursive_query_name r ON g.node_from = r.node_to
) SELECT DISTINCT * FROM recursive_query_name;

上述SQL语句中,

  • 初始查询是SELECT node_from, node_to, 1 FROM my_graph WHERE node_from = 'a',表示查询初始结点信息。
  • 普通递归查询是SELECT g.node_from, g.node_to, r.depth + 1 from my_graph g INNER JOIN recursive_query_name r ON g.node_from = r.node_to,表示查询下一个结点信息。

执行上述SQL语句,得到的结果集包含了从结点a开始,能达到的所有结点信息(包括还没有被访问到的结点)。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Oracle 11GR2的递归WITH子查询方法 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • Redis持久化RDB和AOF优缺点是什么,怎么实现的?我应该用哪一个?

      原文http://www.ymq.io/2018/03/24/redis/   Redis是一种高级key-value数据库。数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务器。 Redis为了保证效…

    Redis 2023年4月11日
    00
  • 数据库建表设计六范式介绍

    针对“数据库建表设计六范式介绍”的完整攻略,我将从以下几个方面逐一解释。 什么是六范式 在数据库建模的过程中,范式理论被广泛运用。其中六范式是范式理论中的最高等级,是指在数据模型设计中,针对每一个可能会变化的数据元素,都进行了单独复杂的设计,保证数据的弹性和变化的可扩展性。同时,这种设计能够保证数据在各种复杂环境下的正确性、可靠性和高效性。 六范式的应用 在…

    database 2023年5月21日
    00
  • MongoDB日志文件过大的解决方法

    当MongoDB日志文件过大时,可以通过以下几个步骤来解决: 1. 查看日志文件大小 使用mongod –version命令查看MongoDB版本号,然后找到该版本对应的日志文件,默认在/var/log/mongodb/目录下。使用ls -lh命令查看日志文件的大小。 sudo ls -lh /var/log/mongodb/mongod.log 2. 修…

    database 2023年5月22日
    00
  • SQLServer中merge函数用法详解

    SQLServer中merge函数用法详解 在SQLServer中,我们经常需要将两张相近的表格进行合并更新,这时merge函数就派上用场了。常见的场景比如我们需要将销售情况表中的数据与客户信息表中的数据进行匹配,更新客户的联系方式。使用merge函数可以轻松完成该任务。 merge函数基本语法 MERGE target_table USING source…

    database 2023年5月21日
    00
  • MySQL命令show full processlist

    命令格式: SHOW [FULL] PROCESSLIST SHOW PROCESSLIST显示哪些线程正在运行,如果您不使用FULL关键词,则只显示每个查询的前100个字符 各列的含义和用途: id: 一个标识 user: 显示当前用户,如果不是root,这 个命令就只显示你权限范围内的sql语句。 host: 显示这个语句是从哪个ip的哪个端口上发出的 …

    MySQL 2023年4月13日
    00
  • scrapy爬虫-scrapy-redis分布式

    1、如何将一个scrapy爬虫项目修改成为一个简单的分布式爬虫项目 官方文档:https://scrapy-redis.readthedocs.io/en/stable/ 只用修改scrapy项目的两个文件就可以了 一个是爬虫组件文件# -*- coding: utf-8 -*- scrapy from scrapy_redis.spiders import…

    Redis 2023年4月13日
    00
  • Redis基本设置

    一.redis 设置密码 使用下载好的 redis-cli.exe 指令: 1.设置密码: config set requirepass 123456 2.查看:info(验证无法通过) 3.授权登陆  auth 123456   二.Redis 更改端口(如从 6379 改到 6820) 1.打开下图:redis.conf  2.将 6379 替代为 68…

    Redis 2023年4月12日
    00
  • 初步介绍MySQL中的集合操作

    初步介绍MySQL中的集合操作 MySQL可以进行各种集合操作,如并集、交集、差集等。这些集合操作是通过使用关键字UNION, INTERSECT, EXCEPT等来实现的。以下是集合操作的详细介绍: 一、UNION操作 使用UNION操作可以将两个或多个SELECT语句返回的结果集合并为一个结果集。UNION操作的基本语法如下: SELECT column…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部