# mysql 8.0 递归处理 (sample database classicmodels _No.4)

全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例

可以去下载 classicmodels 数据库资源如下

[ 点击:classicmodels官网下载]

[也可以去CSDN 去免费资源下载]

前言

我们在做数据的时候 会碰到 部门表 ,员工表,这个一般是树型结构。我们先看下这个 全表的结构


一、查文档(recursion )

当然还是 看 mysql 文档了。

dev.mysql.com/doc/refman/...

recursion 中文解释就是 递归或者循环

二、准备

sql 复制代码
select * FROM classicmodels.employees t
可以理解  report to 就是 父ID 

三、递归处理

WITH RECURSIVE

sql 复制代码
WITH RECURSIVE cte (officeCode,employeeNumber,firstname,lastName, jobTitle,reportsTo ,tree,n ) AS (
    SELECT officeCode,employeeNumber,firstname,lastName, jobTitle,reportsTo, cast(employeeNumber as char(100)) as 'tree'
    , 1 as 'n'
    FROM classicmodels.employees where employeeNumber='1002'
    UNION all
    SELECT t.officeCode,t.employeeNumber,t.firstname,t.lastName, t.jobTitle ,t.reportsTo,
	CONCAT(cn.tree , '->', t.employeeNumber) AS 'tree',n+1 as 'n'
   	FROM classicmodels.employees t
  	INNER JOIN cte cn ON t.reportsTo = cn.employeeNumber
)
SELECT a.employeeNumber,  CONCAT(a.firstname,',',a.lastName) as 'name',
a.jobTitle,a.reportsTo , a.tree,a.n  
FROM cte a 

这个说明下 tree 列就是加的一列

一般的 RECURSIVE 是和 with 一起使用的。下面就是结果

sql 复制代码
也可以 将 
SELECT a.employeeNumber,  CONCAT(a.firstname,',',a.lastName) as 'name',
a.jobTitle,a.reportsTo , a.tree,a.n  
FROM cte a 

替换成 
SELECT a.employeeNumber,b.City,b.country,  CONCAT(a.firstname,',',a.lastName) as 'name',
a.jobTitle,a.reportsTo , a.tree,a.n  
FROM cte a left join classicmodels.offices b on a.officecode=b.officecode

四、提取

sql 复制代码
select tree,
if(n>=1, left(tree,4), null) as '1st',
if(n>=1 and length(tree)>4 ,  substring(tree,6,4), null) as '2st',
if(n>=1 and length(tree)>8 ,  substring(tree,11,4), null) as '3rd',
if(n>=1 and length(tree)>12 ,  substring(tree,16,4), null) as '4th'
from (

WITH RECURSIVE cte (officeCode,employeeNumber,firstname,lastName, jobTitle,reportsTo ,tree,n ) AS (
    SELECT officeCode,employeeNumber,firstname,lastName, jobTitle,reportsTo, cast(employeeNumber as char(100)) as 'tree'
    , 1 as 'n'
    FROM classicmodels.employees where employeeNumber='1002'
    UNION all
    SELECT t.officeCode,t.employeeNumber,t.firstname,t.lastName, t.jobTitle ,t.reportsTo,
	CONCAT(cn.tree , ',', t.employeeNumber) AS 'tree',n+1 as 'n'
   	FROM classicmodels.employees t
  	INNER JOIN cte cn ON t.reportsTo = cn.employeeNumber
)
SELECT a.employeeNumber,  CONCAT(a.firstname,',',a.lastName) as 'name',
a.jobTitle,a.reportsTo , a.tree,a.n  
FROM cte a) dd

截图结果就是 如下,这个基本就是数仓的结构了。

总结

sql 的 递归是个特殊的场景,作为一个做数据产品不建议运用在数据仓库,也不建议让数据开发或者数据分析提数处理。建议前端或者程序去实现递归可不是 sql

以上就是一些分享,谢谢大家喜欢 ,后面还是 有其他关于classicmodels 例子 。

相关推荐
CryptoRzz12 分钟前
欧美(美股、加拿大股票、墨西哥股票)股票数据接口文档
java·服务器·开发语言·数据库·区块链
APItesterCris1 小时前
构建弹性数据管道:利用淘宝商品 API 进行流式数据采集与处理
linux·数据库·windows
九河云1 小时前
TOS + 数字孪生:集装箱码头的智能进化密码
大数据·服务器·网络·数据库·数字化转型
手握风云-1 小时前
MySQL数据库精研之旅第十九期:存储过程,数据处理的全能工具箱(二)
数据库·mysql
孟意昶1 小时前
Doris专题17- 数据导入-文件格式
大数据·数据库·分布式·sql·doris
你可以永远相信功夫熊猫2 小时前
金蝶云·星瀚 | 生产制造成本核算终极实操手册(从0到1,含两套完整案例)
数据库·erp
Thepatterraining2 小时前
MySQL零基础教程:DDL/DCL/DML详解,从建库到存储过程一篇搞定!
数据库·sql·mysql
想ai抽2 小时前
深入starrocks-怎样实现多列联合统计信息
java·数据库·数据仓库
jackletter2 小时前
待补充 五大关系数据库(sqlserver、mysql、oracle、pgsql、sqlite)的列类型:目录
mysql·oracle·sqlserver·sqlite·pgsql·列类型
Y4090012 小时前
MySQL中的“事务”
数据库·mysql