在 达梦数据库(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
(更灵活,跨数据库兼容)。