代码编织梦想

场景:
数据库中的数据存在父子关系(单继承,每一条记录只有一个父记录). 如果要查询一条记录以及他的所有子记录,或者要查询一条记录以及他的所有父记录.那么递归查询就再合适不过了.可以简化复杂的SQL语句。
现在数据库有一张dictionary表,用于存放业务相关字典项

字典表结构(dictionary)

id,name,parent_id

字典表数据

idnameparentId
1字典1NULL
1-1字典1-11
1-2字典1-21
2字典2NULL
2-1字典2-12

开始递归查询

向下递归(从父到子)

WITH RECURSIVE dict AS (
     SELECT *
     FROM dictionary
     WHERE id= '1'
     union ALL
     SELECT dictionary.*
     FROM dictionary,
          dict
     WHERE dictionary.parent_id = dict.id
)
SELECT id AS id, name as name, parent_id as parentId
FROM dict
ORDER BY name

查询结果

idnameparentId
1字典1NULL
1-1字典1-11
1-2字典1-21

向上递归(从子到父)

WITH RECURSIVE dict AS (
     SELECT *
     FROM dictionary
     WHERE id= '2-1'
     union ALL
     SELECT dictionary.*
     FROM dictionary,
          dict
     WHERE dictionary.id = dict.parent_id
)
SELECT id AS id, name as name, parent_id as parentId
FROM dict
ORDER BY name

查询结果

idnameparentId
2字典2NULL
2-1字典2-12

结语

  1. sql中WITH xxxx AS () 是对一个查询子句做别名,同时数据库会对该子句生成临时表;
  2. WITH RECURSIVE 则是一个递归的查询子句,他会把查询出来的结果再次代入到查询子句中继续查询

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/weixin_39157014/article/details/110957194

ORACLE 工作中的知识-爱代码爱编程

1. SQL语句中exists和in的区别 in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被

SqlDBHelper.cs工具类-爱代码爱编程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言代码详情一、执行增删改非查询类方法(不带参数)二、返回单条结果查询类方法(不带参数)三、多条结果查询类方法(不带参数)四、返回DataSet数据集方法(不带参数)五、执行增删改非查询类方法(带参数)六、返回单条结果查询类方法(带参数)七、多条结果查询类方法(带参数)

SqlDataSource控件(数据插入、数据删除、数据查询)-爱代码爱编程

一、数据查询 <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:StudentManagementConnectionString %>" InsertCommand="in

使用DataSourc获取数据库连接报java.sql.SQLException: Access denied for user ‘‘@‘localhost‘ (using password: NO)-爱代码爱编程

错误信息 java.sql.SQLException: Access denied for user ''@'localhost' (using password: NO) 原因 原因就是我们没有传入或者没有配置数据库的username和password,我自己开始写springboot使用JDBC获取连接对象时,我出现这个错误的原因是 我居然

数据库的设计,多表之间的关系、实现关系、范式;-爱代码爱编程

数据库的设计 1.多表之间的关系 1.一对一(了解) *如人和身份证 *分析 一个人只有一张身份证 2.一对多(多对一) * 部门员工 *分析 一个部门有多个员工,一个员工只能有一个部门 3.多对多 *学生课程 *分析 一个学生可以学多个课程,一个课程也可以被多个学生选择 2.实现关系 1.一对多 * 如部门员工 *实现方式:在多

Qt5操作SQLite数据库实例-爱代码爱编程

Qt操作SQLite数据库 Qt提供了一种进程内数据库SQLite。它小巧灵活,无须额外安装配置且支持大部分ANSI SQL92标准,是一个轻量级的数据库,概括起来具有以下优点。 (1)SQLite的设计目的是实现嵌入式SQL数据库引擎,它基于纯C语言代码,已经应用在非常广泛的领域内。(2)SQLite在需要持久存储时可以直接读写硬盘上的数据文件,在无

ORACLE 工作中的知识-爱代码爱编程

1. SQL语句中exists和in的区别 in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被

Java HashMap方法API-爱代码爱编程

方法描述clear()删除 hashMap 中的所有键/值对clone()复制一份 hashMapisEmpty()判断 hashMap 是否为空size()计算 hashMap 中键/值对的数量put()将键/值对添加到 hashMap 中putAll()将所有键/值对添加到 hashMap 中putIfAbsent()如果 hashMap 中不存在指定

那些让我们又爱又恨的缓存写法-爱代码爱编程

阅读目录: 基本写法缓存雪崩全局锁,实例锁字符串锁缓存穿透再谈缓存雪崩总结基本写法 为了方便演示,这里使用Runtime.Cache做缓存容器,并定义个简单操作类。如下: public class CacheHelper    {        public static object Get(string cacheKey)        {

使用DataSourc获取数据库连接报java.sql.SQLException: Access denied for user ‘‘@‘localhost‘ (using password: NO)-爱代码爱编程

错误信息 java.sql.SQLException: Access denied for user ''@'localhost' (using password: NO) 原因 原因就是我们没有传入或者没有配置数据库的username和password,我自己开始写springboot使用JDBC获取连接对象时,我出现这个错误的原因是 我居然

三面阿里(支付宝)Java高开岗,疫情期间复习两月有幸拿到offer-爱代码爱编程

每个程序员都有一个大厂的梦,而互联网大厂首当其冲自然是阿里巴巴最吃香,今天小编就来分享一个小伙进阿里巴巴(支付宝三面)的面经! “不想进大厂的程序员不是好程序员”哈哈哈!!! 今年由于疫情原因,互联网整个行业都比较严峻,我比较幸运,不久前意外收到支付宝的面试(三面)已经拿到了offer。 本来春节过后,是金三银四找工作旺季,大部分人年前年后

索引和jdbc-爱代码爱编程

数据库优化 在进行程序编写以及程序运行时,往往需要进行大量的数据库操作,但是,随着数据量的增大,数据字段的增多,在进行sql查询时往往可能消耗大量的时间,并且获取数据后还需要将数据发送给用户,这样就造成了程序响应时间过长,为了提高客户体验,数据库优化就必须进行(提高效率) 数据库优化提高效率大致分为三类: 1、硬件优化 提高数据库软件服务器硬件性能