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

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

 一、如下SQL1

 SELECT i.*,su1.name as createName,su2.name as updateNameFROM information ileft join sys_user su1 on su1.id=i.create_idleft 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_idFROM eWHERE user_id = #{userId}UNION ALLSELECT e.id, e.user_id, e.parent_idFROM  eINNER JOIN ParentHierarchy ph 
ON e.id = ph.parent_id)SELECT *FROM ParentHierarchyWHERE 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值?

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 项目实战 ---- 商用落地视频搜索系统(6)---UI 结构及与service互动
  • 项目日志——日志输出格式化模块的设计、实现、测试
  • 【MySQL】MySQL基础
  • C++学习笔记(9)
  • zblog自动生成文章插件(百度AI写作配图,图文并茂)
  • 从材料到应用:螺杆支撑座材质选择的多样性与精准性!
  • 结构化开发方法的三种基本控制结构
  • 为什么构造函数不能为虚函数?为什么析构函数可以为虚函数,如果不设为虚函数可能会存在什么问题?
  • WebShell流量特征检测_蚁剑篇
  • 高级法医视频分析技术 2024
  • PPP 、PPPoE 浅析和配置示例
  • vim 快捷命令
  • mysql-PXC实现高可用
  • UniApp实现漂亮的音乐歌词滚动播放效果
  • 如何提升网站的收录率?
  • C++类中的特殊成员函数
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Golang-长连接-状态推送
  • JavaScript的使用你知道几种?(上)
  • Javascript设计模式学习之Observer(观察者)模式
  • jquery ajax学习笔记
  • LeetCode算法系列_0891_子序列宽度之和
  • Linux快速复制或删除大量小文件
  • mongo索引构建
  • nodejs实现webservice问题总结
  • Python - 闭包Closure
  • python 学习笔记 - Queue Pipes,进程间通讯
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 检测对象或数组
  • 配置 PM2 实现代码自动发布
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 数据科学 第 3 章 11 字符串处理
  • 从如何停掉 Promise 链说起
  • 昨天1024程序员节,我故意写了个死循环~
  • ​学习一下,什么是预包装食品?​
  • ​一些不规范的GTID使用场景
  • !!java web学习笔记(一到五)
  • #70结构体案例1(导师,学生,成绩)
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • (13):Silverlight 2 数据与通信之WebRequest
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (算法)N皇后问题
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)ABI是什么
  • (自用)交互协议设计——protobuf序列化
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .ai域名是什么后缀?
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .env.development、.env.production、.env.staging
  • .htaccess 强制https 单独排除某个目录