mysql8.0.25无法兼容在5.7.32能够正常执行的递归查询sql

查询要求

  • 指定一个部门id
  • 在部门表中查询出指定节点及其所有上级节点名称,最终拼装成名称路径,格式为:/根节点/二级节点/三级节点/末级节点

MYSQL:5.7.2

mybatis xml示例

SELECT
	GROUP_CONCAT( NAME SEPARATOR '/' ) 
FROM
	(
	SELECT
		t2.`name` 
	FROM
		(
		SELECT
			@r AS _id,
			( SELECT @r := parent_id FROM my_department WHERE id = _id ) AS parent_id,
			@l := @l + 1 AS lvl 
		FROM
			( SELECT @r := #{deparmentId}, @l := 0 ) vars,
			my_department AS h WHERE @r  ]]> 0 ) t1
			JOIN my_department t2 ON t1._id = t2.Id 
		ORDER BY
		t2.id ASC 
	) reverse_deparment_list

上述SQL在MYSQL:5.7.2中正常执行,结果不为空
上述SQL在MYSQL:8.0.25中正常执行,但是结果为空

MYSQL:8.0.25

mybatis xml示例

WITH RECURSIVE department_aggs ( ID, deparmentNameGroup ) AS (
	SELECT
		ID,
		CAST( NAME AS CHAR ( 500 ) ) 
	FROM
		my_department 
	WHERE
		parent_id = 0 UNION ALL
	SELECT
		S.ID,
		CONCAT( M.deparmentNameGroup, "/", S.NAME ) 
	FROM
		department_aggs M
		JOIN my_department S ON M.ID = S.parent_id 
	) SELECT
	* 
FROM
	department_aggs 
WHERE
	ID = #{deparmentId}
	
ORDER BY
	deparmentNameGroup

上述SQL在MYSQL:5.7.2中无法正常执行
上述SQL在MYSQL:8.0.25中正常执行,结果不为空

兼容性问题

WITH RECURSIVE 在8.0开始支持
mysql8.0.25无法兼容在5.7.32能够正常执行的递归查询sql_第1张图片

参考示例

  • MySQL Recursive WITH (Common Table Expression) 官方示例

你可能感兴趣的:(Solutions,sql,mybatis,mysql)