使用SQL语句写递归查询

要编写递归 SQL 语句,你可以使用通用表达式(Common Table Expressions,CTE)和递归查询功能。CTE 允许在 SQL 查询中定义临时的命名查询,并且可以在查询内部引用自身。

以下是一个示例来演示如何编写递归 SQL 语句:

假设有一个员工表 employees,其中包含列 idnamemanager_id,表示员工的唯一标识、姓名和上级经理的标识。

要获取某个员工及其所有下属的信息,可以使用递归查询来实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
WITH RECURSIVE employee_hierarchy AS (
  SELECT id, name, manager_id
  FROM employees
  WHERE id = <employee_id> -- 指定初始员工的 ID
 
  UNION ALL
 
  SELECT e.id, e.name, e.manager_id
  FROM employees e
  JOIN employee_hierarchy eh ON e.manager_id = eh.id
)
SELECT *
FROM employee_hierarchy;

  

上述示例中,使用了一个名为 employee_hierarchy 的 CTE 命名查询。首先,初始化递归查询的起始条件,从 employees 表中选择指定的初始员工,并将其作为递归查询的基础。然后,递归部分通过连接 employees 表与前一级别的结果集(即 employee_hierarchy)来获取下属的信息,直到没有下属为止。

最后,通过在主查询中选择 employee_hierarchy 所有的结果,你将获得包括初始员工及其所有下属的完整员工信息。

请注意,递归查询可能涉及到表的自连接和循环引用,因此需要谨慎使用,并确保递归终止条件正确设置,以避免无限循环。

 

如下是根据自己业务,查询的向上递归

1
2
3
4
5
6
7
8
9
10
11
WITH RECURSIVE depart_hierarchy AS (
                SELECT id,  parent_id
                FROM sys_depart
                WHERE depart_manager=#{username}
                UNION ALL
                SELECT e.id, e.parent_id
                FROM sys_depart e
                         JOIN depart_hierarchy eh ON e.id = eh.parent_id
            )
            SELECT id
            FROM depart_hierarchy WHERE LENGTH(parent_id)>0

  

posted @   张亮java  阅读(759)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示