PostgreSQL递归查询sql

案例

查询指定租户下,给定部门编码集合的部门及其下级部门关系树。可以用于根据部门编码集合,构建部门树形结构

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;

你可能感兴趣的:(postgresql,sql,数据库)