达梦数据库(DM) 中,递归查询组织树(层级结构数据,比如部门上下级关系、菜单树)通常有两种实现方式:

方式一:使用 CONNECT BY(类似 Oracle 的层次查询)

达梦数据库兼容 Oracle 的 CONNECT BY 语法,可以直接写层级查询。

假设有表 ORG

CREATE TABLE ORG (
    ORG_ID INT PRIMARY KEY,
    ORG_NAME VARCHAR(100),
    PARENT_ID INT
);

查询组织树:

SELECT ORG_ID,
       ORG_NAME,
       PARENT_ID,
       LEVEL AS LVL,
       SYS_CONNECT_BY_PATH(ORG_NAME, '/') AS PATH
FROM ORG
START WITH PARENT_ID IS NULL      -- 根节点(没有上级的组织)
CONNECT BY PRIOR ORG_ID = PARENT_ID;

说明:

  • LEVEL 表示层级深度(根节点是 1,子节点依次递增)。
  • SYS_CONNECT_BY_PATH 用于拼接从根到当前节点的路径。
  • PRIOR ORG_ID = PARENT_ID 表示递归方向:父节点 → 子节点。

方式二:使用 递归 CTE(WITH RECURSIVE)

如果你更习惯标准 SQL 写法,可以用 WITH RECURSIVE

WITH RECURSIVE ORG_TREE (ORG_ID, ORG_NAME, PARENT_ID, LVL, PATH) AS (
    -- 基础层(根节点)
    SELECT ORG_ID,
           ORG_NAME,
           PARENT_ID,
           1 AS LVL,
           CAST(ORG_NAME AS VARCHAR(500)) AS PATH
    FROM ORG
    WHERE PARENT_ID IS NULL

    UNION ALL

    -- 递归部分(子节点)
    SELECT O.ORG_ID,
           O.ORG_NAME,
           O.PARENT_ID,
           OT.LVL + 1,
           OT.PATH || '/' || O.ORG_NAME
    FROM ORG O
    JOIN ORG_TREE OT ON O.PARENT_ID = OT.ORG_ID
)
SELECT * FROM ORG_TREE
ORDER BY PATH;

说明:

  • WITH RECURSIVE 可以自定义层级列和路径。
  • UNION ALL 保证递归拼接。
  • 这种写法兼容性更强,方便迁移到其他数据库(PostgreSQL、MySQL 8+ 等)。

✅ 总结:

  • 快速写法:用 CONNECT BY(Oracle 风格,达梦完全支持)。
  • 标准写法:用 WITH RECURSIVE(更灵活,跨数据库兼容)。