2.2 递归
程序调用自身的编程技巧称为递归( recursion)。上面的子查询中出现自身的别名就是一个
例子。一般来说,递归需要有边界条件(终止条件)、递归前进段(执行逻辑)和递归返回段
(终止执行并返回结果)。当边界条件不满足时,递归前进(继续执行);当边界条件满足时,
递归返回(终止执行并返回结果)。
2.3 递归 CTE
综上所述,递归 CTE 是不断调用自己,直到满足终止条件才输出所有数据。终止条件一般是
“某一次查询的结果集没有数据”(类似于 exists 子句的效果)。
三、实现示例:
3.1 MySQL CTE 实现树查找
表结构:
CREATE TABLE `t_sys_organization` (
`org_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '组织机构 Id',
`org_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT
NULL COMMENT '组织机构名称',
`parent_id` int(11) unsigned NOT NULL COMMENT '父节点为空的是根机构',
`level` int(11) DEFAULT NULL COMMENT '组织层级',
`is_valid` int(11) DEFAULT NULL COMMENT '是否有效',
PRIMARY KEY (`org_id`),
UNIQUE KEY `idx_oname` (`org_name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=84 DEFAULT CHARSET=utf8
--实现查找根节点下面所有子节点并带着部门名称
with recursive t_rec as -- recursive 为关键字,可以不列出字段列表
(
select
m.org_id
,m.org_name
,m.parent_id
,m.level
,concat('->',m.org_id) as nodepath -- 拼接各结点的 id
,concat('->',m.org_name) as nodename
from t_sys_organization m
where org_id = 1
union all
select
t1.org_id
,t1.org_name
,t1.parent_id
,t1.level
评论