emp table in mysql 的递归结果
The recursive result of emp table in mysql
我试图在 mysql 中获取递归结果,而不是在 mysql 5.X 中使用递归功能作为实例。
这是 emp table
的创建 table 和插入脚本
DROP TABLE IF EXISTS emp;
CREATE TABLE emp (
empno decimal(4,0) NOT NULL,
ename varchar(10) default NULL,
job varchar(9) default NULL,
mgr decimal(4,0) default NULL,
hiredate date default NULL,
sal decimal(7,2) default NULL,
comm decimal(7,2) default NULL,
deptno decimal(2,0) default NULL
);
INSERT INTO emp VALUES ('7369','SMITH','CLERK','7902','1980-12-17','800.00',NULL,'20');
INSERT INTO emp VALUES ('7499','ALLEN','SALESMAN','7698','1981-02-20','1600.00','300.00','30');
INSERT INTO emp VALUES ('7521','WARD','SALESMAN','7698','1981-02-22','1250.00','500.00','30');
INSERT INTO emp VALUES ('7566','JONES','MANAGER','7839','1981-04-02','2975.00',NULL,'20');
INSERT INTO emp VALUES ('7654','MARTIN','SALESMAN','7698','1981-09-28','1250.00','1400.00','30');
INSERT INTO emp VALUES ('7698','BLAKE','MANAGER','7839','1981-05-01','2850.00',NULL,'30');
INSERT INTO emp VALUES ('7782','CLARK','MANAGER','7839','1981-06-09','2450.00',NULL,'10');
INSERT INTO emp VALUES ('7788','SCOTT','ANALYST','7566','1982-12-09','3000.00',NULL,'20');
INSERT INTO emp VALUES ('7839','KING','PRESIDENT',NULL,'1981-11-17','5000.00',NULL,'10');
INSERT INTO emp VALUES ('7844','TURNER','SALESMAN','7698','1981-09-08','1500.00','0.00','30');
INSERT INTO emp VALUES ('7876','ADAMS','CLERK','7788','1983-01-12','1100.00',NULL,'20');
INSERT INTO emp VALUES ('7900','JAMES','CLERK','7698','1981-12-03','950.00',NULL,'30');
INSERT INTO emp VALUES ('7902','FORD','ANALYST','7566','1981-12-03','3000.00',NULL,'20');
INSERT INTO emp VALUES ('7934','MILLER','CLERK','7782','1982-01-23','1300.00',NULL,'10');
我想看到这样的结果
"ENAME" "BOSS" "EMPNO" "PRIORENAME" "LEVEL"
"king" NULL 7839 "" 1
"jones" 7839 7566 "king" 2
"blake" 7839 7698 "king" 2
"clark" 7839 7782 "king" 2
"ford" 7566 7902 "jones" 3
"ward" 7698 7521 "blake" 3
"james" 7698 7900 "blake" 3
"miller"7782 7934 "clark" 3
"allen" 7698 7499 "blake" 3
"scott" 7566 7788 "jones" 3
"martin"7698 7654 "blake" 3
"turner"7698 7844 "blake" 3
"adams" 7788 7876 "scott" 4
"smith" 7902 7369 "ford" 4
我尝试了很多但不是很成功
MySQL 8.0 添加了对 CTE(常见 table 表达式)的支持,包括递归 CTE。在 8.0 之前的版本中(即 MySQL 5.x)没有对递归查询的原生支持。
使用 MySQL 5.x 有几种方法可以 returning 结果集(来自问题中提出的 table 的查询。)
一种方法是开发 MySQL 函数(存储程序),return “priorname” 和 “level” 值。
SELECT t.ENAME
, t.mgr AS `BOSS`
, t.EMPNO
, udf_emp_priorname(t.empno) AS `PRIORNAME`
, udf_emp_level(t.empno) AS `LEVEL`
FROM emp t
ORDER BY ...
另一种方法是连接 return 级别 1、return 级别 2、return 级别 3 的单独查询的结果,向下有限数量的级别。
(
SELECT t1.ENAME
, t1.mgr AS `BOSS`
, t1.EMPNO
, '' AS `PRIORNAME`
, 1 AS `LEVEL`
FROM emp t1
WHERE t1.mgr IS NULL
)
UNION ALL
(
SELECT t2.ENAME
, t2.mgr AS `BOSS`
, t2.EMPNO
, t1.ENAME AS `PRIORNAME`
, 2 AS `LEVEL`
FROM emp t1
JOIN emp t2 ON t2.mgr = t1.EMPNO
WHERE t1.mgr IS NULL
)
UNION ALL
(
SELECT t3.ENAME
, t3.mgr AS `BOSS`
, t3.EMPNO
, t2.ENAME AS `PRIORNAME`
, 3 AS `LEVEL`
FROM emp t1
JOIN emp t2 ON t2.mgr = t1.EMPNO
JOIN emp t3 ON t3.mgr = t2.EMPNO
WHERE t1.mgr IS NULL
)
我试图在 mysql 中获取递归结果,而不是在 mysql 5.X 中使用递归功能作为实例。
这是 emp table
的创建 table 和插入脚本DROP TABLE IF EXISTS emp;
CREATE TABLE emp (
empno decimal(4,0) NOT NULL,
ename varchar(10) default NULL,
job varchar(9) default NULL,
mgr decimal(4,0) default NULL,
hiredate date default NULL,
sal decimal(7,2) default NULL,
comm decimal(7,2) default NULL,
deptno decimal(2,0) default NULL
);
INSERT INTO emp VALUES ('7369','SMITH','CLERK','7902','1980-12-17','800.00',NULL,'20');
INSERT INTO emp VALUES ('7499','ALLEN','SALESMAN','7698','1981-02-20','1600.00','300.00','30');
INSERT INTO emp VALUES ('7521','WARD','SALESMAN','7698','1981-02-22','1250.00','500.00','30');
INSERT INTO emp VALUES ('7566','JONES','MANAGER','7839','1981-04-02','2975.00',NULL,'20');
INSERT INTO emp VALUES ('7654','MARTIN','SALESMAN','7698','1981-09-28','1250.00','1400.00','30');
INSERT INTO emp VALUES ('7698','BLAKE','MANAGER','7839','1981-05-01','2850.00',NULL,'30');
INSERT INTO emp VALUES ('7782','CLARK','MANAGER','7839','1981-06-09','2450.00',NULL,'10');
INSERT INTO emp VALUES ('7788','SCOTT','ANALYST','7566','1982-12-09','3000.00',NULL,'20');
INSERT INTO emp VALUES ('7839','KING','PRESIDENT',NULL,'1981-11-17','5000.00',NULL,'10');
INSERT INTO emp VALUES ('7844','TURNER','SALESMAN','7698','1981-09-08','1500.00','0.00','30');
INSERT INTO emp VALUES ('7876','ADAMS','CLERK','7788','1983-01-12','1100.00',NULL,'20');
INSERT INTO emp VALUES ('7900','JAMES','CLERK','7698','1981-12-03','950.00',NULL,'30');
INSERT INTO emp VALUES ('7902','FORD','ANALYST','7566','1981-12-03','3000.00',NULL,'20');
INSERT INTO emp VALUES ('7934','MILLER','CLERK','7782','1982-01-23','1300.00',NULL,'10');
我想看到这样的结果
"ENAME" "BOSS" "EMPNO" "PRIORENAME" "LEVEL"
"king" NULL 7839 "" 1
"jones" 7839 7566 "king" 2
"blake" 7839 7698 "king" 2
"clark" 7839 7782 "king" 2
"ford" 7566 7902 "jones" 3
"ward" 7698 7521 "blake" 3
"james" 7698 7900 "blake" 3
"miller"7782 7934 "clark" 3
"allen" 7698 7499 "blake" 3
"scott" 7566 7788 "jones" 3
"martin"7698 7654 "blake" 3
"turner"7698 7844 "blake" 3
"adams" 7788 7876 "scott" 4
"smith" 7902 7369 "ford" 4
我尝试了很多但不是很成功
MySQL 8.0 添加了对 CTE(常见 table 表达式)的支持,包括递归 CTE。在 8.0 之前的版本中(即 MySQL 5.x)没有对递归查询的原生支持。
使用 MySQL 5.x 有几种方法可以 returning 结果集(来自问题中提出的 table 的查询。)
一种方法是开发 MySQL 函数(存储程序),return “priorname” 和 “level” 值。
SELECT t.ENAME
, t.mgr AS `BOSS`
, t.EMPNO
, udf_emp_priorname(t.empno) AS `PRIORNAME`
, udf_emp_level(t.empno) AS `LEVEL`
FROM emp t
ORDER BY ...
另一种方法是连接 return 级别 1、return 级别 2、return 级别 3 的单独查询的结果,向下有限数量的级别。
(
SELECT t1.ENAME
, t1.mgr AS `BOSS`
, t1.EMPNO
, '' AS `PRIORNAME`
, 1 AS `LEVEL`
FROM emp t1
WHERE t1.mgr IS NULL
)
UNION ALL
(
SELECT t2.ENAME
, t2.mgr AS `BOSS`
, t2.EMPNO
, t1.ENAME AS `PRIORNAME`
, 2 AS `LEVEL`
FROM emp t1
JOIN emp t2 ON t2.mgr = t1.EMPNO
WHERE t1.mgr IS NULL
)
UNION ALL
(
SELECT t3.ENAME
, t3.mgr AS `BOSS`
, t3.EMPNO
, t2.ENAME AS `PRIORNAME`
, 3 AS `LEVEL`
FROM emp t1
JOIN emp t2 ON t2.mgr = t1.EMPNO
JOIN emp t3 ON t3.mgr = t2.EMPNO
WHERE t1.mgr IS NULL
)