MySQL 8 列出相关依赖 使用CTE(公共数据表达式)

直接 SQL 实现递归的 with 语法——公共数据表达式 Common Table Expressions (CTE) 是一个命名的临时结果集,它存在于单个语句的范围内,并可能在该语句后面引用,可能会多次。

# 创建测试表
create table job_depend(
  sn_id int auto_increment comment '行号'
    primary key,
  job_id varchar(20) null comment '作业ID',
  depend_job_id varchar(20) null comment '依赖作业'
)comment '作业依赖';
# 插入测试数据
INSERT INTO job_depend (job_id, depend_job_id) VALUES ('b', 'a');
INSERT INTO job_depend (job_id, depend_job_id) VALUES ('c', 'b');
INSERT INTO job_depend (job_id, depend_job_id) VALUES ('d', 'b');
INSERT INTO job_depend (job_id, depend_job_id) VALUES ('e', 'c');

# CTE 查询所有父代和子代 RECURSIVE(递归)
WITH RECURSIVE
parent(job_id, depend_job_id, level) AS(
  SELECT job_id, depend_job_id, 0 AS level
  FROM job_depend WHERE job_id = 'a'
  UNION ALL
  SELECT A.job_id, A.depend_job_id, level - 1
  FROM job_depend A JOIN parent B ON A.job_id = B.depend_job_id
),
child(job_id, depend_job_id, level) AS(
  SELECT job_id, depend_job_id, 0 AS level
  FROM job_depend WHERE depend_job_id = 'a'
  UNION ALL
  SELECT A.job_id, A.depend_job_id, level + 1
  FROM job_depend A JOIN child B ON A.depend_job_id = B.job_id
)
SELECT * FROM parent
UNION
SELECT * FROM child
ORDER BY level;

MySQL 8 两个新特性 公共数据表达式(临时结果集)官方文档: https://dev.mysql.com/doc/refman/8.0/en/with.html 窗口函数(逐行统计函数)官方文档: (不用 group by 而在每行显示类似 sum() 等结果,用来实现排名和占比等功能) https://dev.mysql.com/doc/refman/8.0/en/window-functions-usage.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏运维技术迷

MySQL数据库(四):约束条件

安装环境: 操作系统版本:RHEL 6.5 版本:MYSQL 5.5 约束条件的作用: 限制如何给字段赋值,创建表的时候如果没有设置的话,就是my...

3215
来自专栏性能与架构

Mysql 8 重要新特性 - CTE 通用表表达式

2606
来自专栏Hongten

mysql_语法总结

我们执行代码就可以创建test数据库了,如果想要查看我们是否创建好了数据库test,我们可以通过一下代码查看mysql中的所有数据库

742
来自专栏cloudskyme

oracle查找索引及表的其它属性

1、查找表的所有索引(包括索引名,类型,构成列): select t.*,i.index_type from user_ind_columns t,user_i...

3747
来自专栏CaiRui

Mysql-5-数据表的基本操作

1.创建表:之前需要use database database_name 然后create table 表名(); 例:创建员工表tb_employee1,结构...

2306
来自专栏个人随笔

MySQL 关于索引那点事

索引 其实数据库中的数据是按页存放的 其实索引也是按页存放的 所以本质上索引也占硬盘空间(以最小的消耗,换取最大的利益) 索引是一种有效组合数据的方式!为快速...

2779
来自专栏文渊之博

探索SQL Server元数据(三):索引元数据

在第一篇中我介绍了如何访问元数据,元数据为什么在数据库里面,以及如何使用元数据。介绍了如何查出各种数据库对象的在数据库里面的名字。第二篇,我选择了触发器的主题,...

1561
来自专栏技术小站

(转)MySQL之char、varchar和text的设计

http://www.cnblogs.com/billyxp/p/3548540.html

752
来自专栏个人随笔

sql sever分组查询和连接查询

分组查询 select 查询信息 from 表名 where 条件 group by 按照列分组(可多个 ,隔开) order by 排序方式 (查询信息如果列...

3085
来自专栏互联网技术栈

【转】MySQL松散索引扫描与紧凑索引扫描

在优化group by查询的时候,一般的会想到两个名词:松散索引扫描(Loose Index Scan)和紧凑索引扫描(Tight Index Scan),因为...

1293

扫码关注云+社区