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 条评论
登录 后参与评论

相关文章

来自专栏PHP技术

MyISAM InnoDB 区别(回顾)

索引是快速搜索的关键。MySQL索引的建立对于MySQL的高效运行是很重要的。下面介绍几种常见的MySQL索引类型。 在数据库表中,对字段建立索引可以大大提高查...

3355
来自专栏Laoqi's Linux运维专列

shell命令基本知识点

命令历史 # cat /root/.bash_history       //存放历史命令的地方 # history      //查看命令历史的条数 # ec...

3458
来自专栏散尽浮华

mysql操作命令梳理(1)-索引

1、创建索引 索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER TABLE来给表增加索引。以下命令语句分别展...

1956
来自专栏python3

Django简介

Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起,...

812
来自专栏农夫安全

代码审计之SQL注入漏洞

SQL注入: 我的理解很简单,能代入到数据库查询,且没有过滤,或过滤不严谨,就可以造成SQL注入 演示环境:linux+apache+...

3357
来自专栏有趣的django

15.MySQL(三) 索引类型

索引类型 先创建表 mysql> CREATE TABLE test( -> id INT, -> username VARCHAR(16), ...

31012
来自专栏Golang语言社区

mac系统下搭建go语言环境

1,首先查看是否安装go,或者安装版本 yishiyaonie:GO liuhanlin$ go versiongo version go1.5.1 darwi...

4148
来自专栏C/C++基础

ERROR 1062 (23000) at line 1: Duplicate entry '1332883220' for key 'group_key'

我有一个数据表,记录一个QQ号加好友的活跃天数、加好友次数、加好友的toUin数等信息。数据表的建表语句如下:

764
来自专栏DOTNET

【翻译】MongoDB指南/CRUD操作(三)

【原文地址】https://docs.mongodb.com/manual/ CRUD操作(三) 主要内容: 原子性和事务(Atomicity and Tran...

2609
来自专栏java达人

mysql explain详解

对于经常使用mysql的兄弟们,对explain一定不会陌生。当你在一条SELECT语句前放上关键词EXPLAIN,MySQL解释它将如何处理SELECT,提供...

17110

扫码关注云+社区