查询指定租户下,给定部门编码集合的部门及其下级部门关系树。可以用于根据部门编码集合,构建部门树形结构
WITH RECURSIVE r AS (
SELECT department_code AS ID, parent_organ_code AS pid, op_type
FROM department
WHERE tenant_id = '111' AND department_code IN ('1', '2', '3', '4')
UNION
SELECT d.department_code AS ID, d.parent_organ_code AS pid, d.op_type
FROM department d, r
WHERE d.parent_organ_code = r.ID AND d.tenant_id = '111'
)
SELECT * FROM r;
这段 SQL 语句使用了递归 CTE(通用表达式)完成了查询,以下是具体的步骤:
首先,从表 department 中选出 tenant_id 为给定 #{tenantId} 的并且部门编号(department_code)在 ‘1’, ‘2’, ‘3’, ‘4’ 中的部门,
SELECT department_code AS ID,parent_organ_code AS pid,op_type
FROM department
WHERE tenant_id='111' AND department_code IN ('1', '2', '3', '4')
将上述查询语句的结果作为递归查询的初始结果集(R(0))。
其次,将上一步返回的结果集与原表 department 相连(用 UNION)进行递归查询。
SELECT d.department_code AS ID,d.parent_organ_code AS pid,d.op_type
FROM department d,r
WHERE d.parent_organ_code=r.ID AND d.tenant_id='111'
其中,r 是上一次递归查询返回的结果集,用于当前查询中查找子部门。以上述查询中的 d 为例,d 表示从表 department 中查找出来的下一级子部门记录。
重复第 2 步的递归过程,直到最后没有子节点可查为止。
返回所有的查询结果(包含初始结果集和所有递归查询返回的结果集),作为最终查询结果。
WITH RECURSIVE 是一种递归公共表表达式(Recursive Common Table Expression,RCTE)语法,与 PostgreSQL 并不特别相关。其他数据库管理系统(DBMS)也支持 RCTE,比如 Oracle 和 SQL Server 等。不过,每个 DBMS 对于 RCTE 的支持细节是不同的,有些地方可能会有类似的但略有差异的实现方式。
MySQL 8.0 也引入了 WITH RECURSIVE 语法,类似于 PostgreSQL,但是 MySQL 需要加上 RECURSIVE 关键词。以下是 MySQL 的语法格式:
WITH [RECURSIVE] cte_name (column_list) AS (
initial_query
UNION [ALL]
recursive_query
)
SELECT * FROM cte_name;