oracle 递归获取id和id的所有子机构

本文介绍了一种使用SQL从RBAC_GROUP表中查询特定机构及其所有子机构的方法。通过使用CONNECT BY PRIOR语法,可以有效地获取指定ID为'00'的机构及其下属的所有子机构。

在表RBAC_GROUP 中

 table rbac_group {

id  --机构

parentid --父机构

}

id           parentid

00        00

01        00

02        00

03        01


-- 获取id和id的所有子机构

SELECT * FROM RBAC_GROUP CONNECT BY PRIOR ID=PARENTID START WITH ID='00'
<think>我们已知用户想要查询当前部门下所有部门的IDname。 根据引用[5]中的示例,我们可以使用MySQL的递归CTE来实现。 假设部门表名为`dept`,包含字段`id`(部门ID)、`parent_id`(父部门ID)、`name`(部门名称)。 用户需要传入一个当前部门的ID(例如:变量名为`@current_dept_id`),然后递归查询出所有部门(包括直接间接部门)。 步骤: 1. 定义递归CTE:包括两个部分,锚点部分(起始部门)递归部分(连接部门)。 2. 锚点部分:选择当前部门(传入的部门ID)作为起点。 3. 递归部分:通过连接`dept`表CTE自身,找到当前部门的所有部门(即部门的parent_id等于CTE中的部门id)。 4. 最后从CTE中查询出所有部门的idname。 注意:在MySQL中,递归CTE需要使用`WITH RECURSIVE`关键字。 具体SQL语句如下(假设传入的当前部门ID为1): </think>以下是使用 SQL 递归查询获取当前部门下所有部门的 ID name 的完整实现方法: ### 核心实现(MySQL 8.0+) ```sql WITH RECURSIVE dept_tree AS ( -- 初始查询:定位起始部门 SELECT id, name, parent_id, CAST(id AS CHAR(200)) AS path -- 可选:部门路径跟踪 FROM dept WHERE id = 1 -- 替换为实际部门ID(如北京总公司ID) UNION ALL -- 递归查询:逐级获取下级部门 SELECT child.id, child.name, child.parent_id, CONCAT(parent.path, ' -> ', child.id) -- 路径拼接 FROM dept child INNER JOIN dept_tree parent ON child.parent_id = parent.id -- 关键连接条件 ) SELECT id, name FROM dept_tree; ``` ### 关键解释 1. **递归结构**: - **锚点成员**:`WHERE id = 1` 定位起始部门(如北京总公司) - **递归成员**:`INNER JOIN ... ON child.parent_id = parent.id` 通过父关系递归查询所有部门 2. **路径跟踪**: - `path` 字段记录部门层级路径(如 `1 -> 2 -> 5`) - 可选功能,便于直观查看部门层级关系 3. **结果过滤**: - 最终 `SELECT id, name` 仅返回所需字段 - 若需排除起始部门,添加 `WHERE parent_id IS NOT NULL` ### 示例执行结果(引用[5]数据) | id | name | |-----|--------------| | 1 | 北京总公司 | | 2 | 北京研发部 | | 5 | 研发项目组 | | 6 | 前端组 | | 7 | 后端组 | | 8 | 测试组 | | 3 | 北京市场部 | | 9 | 销售组 | | 4 | 北京运营部 | | 10 | 运营组 | ### 跨数据库适配 1. **SQL Server/Oracle**: ```sql WITH dept_tree AS (...) -- 去掉 RECURSIVE 关键字 SELECT id, name FROM dept_tree ``` 2. **PostgreSQL**: ```sql WITH RECURSIVE dept_tree AS (...) -- 语法与MySQL相同 ``` ### 性能优化建议 1. **索引优化**: ```sql CREATE INDEX idx_parent_id ON dept(parent_id); -- 加速递归连接 ``` 2. **层级深度限制**: ```sql SELECT id, name FROM dept_tree WHERE LENGTH(path) - LENGTH(REPLACE(path, '->', '')) < 5 -- 限制5级深度 ``` 3. **大数据量分页**: ```sql SELECT id, name FROM dept_tree LIMIT 20 OFFSET 0; -- 分页查询 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仰望星空@脚踏实地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值