使用SQL语句写递归查询

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

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

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

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

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 所有的结果,你将获得包括初始员工及其所有下属的完整员工信息。

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

 

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

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 @ 2023-07-12 20:16  张亮java  阅读(710)  评论(0编辑  收藏  举报