当前位置: 首页 > article >正文

表连接查询之两个left join与递归SQL

 一、如下SQL1

 SELECT i.*,su1.name as createName,su2.name as updateName
        FROM information i
        left join sys_user su1 on su1.id=i.create_id
        left join sys_user su2 on su2.id=i.update_id

 二、分析

 1、SELECT i.*,su.name as createName,sua.name as updateName FROM information i:

查询结果为  information表的所有列(i.*),以及两个左连接的结果中的name字段。

 2、left join sys_user su1 on su1.id=i.create_id:

左连接,将information表中的每一行  与sys_user表中id   等于  information表中create_id的行  匹配。如果create_id在information表中没有对应的值,那么这个字段的值就是NULL。

3、left join sys_user su2 on su2.id=i.update_id:

左连接,将information表中的每一行与sys_user表中id等于information表中update_id的行匹配

结果集

(1,1,2,张三,李四),

(2,1,3,张三,王五),

(3,2,4,李四,小明)

三、如下SQL2

WITH RECURSIVE ParentHierarchy AS (SELECT id, user_id, parent_id
                                   FROM e
                                   WHERE user_id = #{userId}
                                   UNION ALL
                                   SELECT e.id, e.user_id, e.parent_id
                                   FROM  e
                                   INNER JOIN ParentHierarchy ph 
ON e.id = ph.parent_id)
        SELECT *
        FROM ParentHierarchy
        WHERE parent_id = 0;

1、WITH RECURSIVE ParentHierarchy AS (...):定义了一个递归的公用表 表达式,名为ParentHierarchy 。

2、SELECT id, user_id, parent_id FROM e WHERE user_id = #{userId}:递归的初始查询部分,即递归的基准条件,从表e中选择那些user_id字段等于指定userId的记录,这些记录就是层级结构的起始点。

3、UNION ALL:这个关键字用来将初始查询的结果和后续递归查询的结果合并在一起。(与union1不同,可能有重复记录)

4、SELECT e.id, e.user_id, e.parent_id FROM e INNER JOIN ParentHierarchy ph ON e.id = ph.parent_id:递归的主体部分,将表e与已经构建的ParentHierarchy进行内连接,匹配e表中的id和ParentHierarchy中的parent_id,从而得到下一级的层级数据。

5、SELECT * FROM ParentHierarchy WHERE parent_id = 0:最终的查询语句,它从递归构建的层级结构中选出所有parent_id为0的记录。

举例说明:表e

1、第一步

user_id=15

初始PH (6,3,15)

e表

inner join 它会返回两个表中字段匹配的行  ph.parent_id=e.id

结果集

(1,0,10)

2、第二步

选出所有parent_id为0的记录

结果

(1,0,10)

四、思考

什么时候此递归会返回null值?


http://www.kler.cn/a/298764.html

相关文章:

  • OceanBase数据库设计与管理:构建高效分布式数据架构基石
  • 深入学习 Python 量化编程
  • 嵌入式系统中的 OpenCV 与 OpenGLES 协同应用
  • 前端多语言
  • ffmpeg常用命令及介绍
  • 2.Numpy练习(1)
  • 使用Python本地搭建http.server文件共享服务并实现公网环境远程访问——“cpolar内网穿透”
  • 党务政务服务|基于SprinBoot+vue的党务政务服务热线系统(源码+数据库+文档)
  • Swagger UI 无法发送 Cookie
  • FFmpeg读取文件列表
  • FunASR搭建语音识别服务和VAD检测
  • GPT-4o mini轻量级大模型颠覆AI的未来
  • 软件测试学习笔记丨Vim编辑器的常用命令
  • 挂轨巡检机器人在发电厂与煤矿皮带机场景的应用
  • C语言猜数字小游戏(6)
  • Tensorflow2如何读取自制数据集并训练模型?-- Tensorflow自学笔记13
  • 如何在 Nuxt 3 中有效使用 TypeScript
  • TCP-IP5层模型
  • Hadoop命令
  • 【鸿蒙 HarmonyOS NEXT】使用屏幕属性display:获取屏幕宽高
  • vue3 响应式 API:shallowRef()和shallowReactive()
  • this->setAttribute(Qt::WA_DeleteOnClose,true)的原理
  • 海洋运输船5G智能工厂物联数字孪生平台,推进制造业数字化转型
  • 【vue使用Sass报错】启动项目报错 Syntax Error: SassError: expected selector
  • 数据房屋的未来展望
  • clickhouse网络互通迁移一张表数据