oracle 级联查询 根路径
2024-09-16 05:37:05
级联查询有很多教程示例,但是没有找到求特定子孙到根的路径的例子,折腾了一番总算想出方法了。
现假设我们拥有一个菜单表t_menu,其中只有三个字段:id、name和parent_id。它们是具有父子关系的,最顶级的菜单对应的parent_id为0。现假设我们拥有如下记录:
id |
name |
parent_id |
1 |
菜单01 |
0 |
2 |
菜单02 |
0 |
3 |
菜单03 |
0 |
4 |
菜单0101 |
1 |
5 |
菜单0102 |
1 |
6 |
菜单0103 |
1 |
7 |
菜单010101 |
4 |
8 |
菜单010201 |
5 |
9 |
菜单010301 |
6 |
10 |
菜单0201 |
2 |
11 |
菜单0202 |
2 |
12 |
菜单020101 |
10 |
13 |
菜单020102 |
10 |
14 |
菜单020103 |
10 |
15 |
菜单0301 |
3 |
16 |
菜单0302 |
3 |
17 |
菜单030201 |
16 |
18 |
菜单030202 |
16 |
19 |
菜单030203 |
16 |
(示例数据来自一篇不错的级联查询教程)
假设需要求菜单parentId为16的数据到菜单03的路径,用
select *,sys_connect_by_path(name,'/') from t_menu where parent_id = 16 start with id is not null connect by prior id = parent_id
得出的是每个节点往下的路径。
把prior 放在parent_id 前面,可以得出全路径,但是不好提取到根的路径。而且如果数据库很大, start with 用 is not null 会很慢。
这里我想到一个点子
select * from t_menu t
left join (
select connect_by_root id as id ,sys_connect_by_path(name,'/') path
from t_menu
where id=3
start with (select id from t_menu where parent_id =16)
connect by id =prior parent_id) t1
on t.id=t1.id
用connect_by_root 来取出path的actul id,再和原表左联。如有更好的方法,欢迎交流
最新文章
- 【转载】WEB前端开发规范文档
- Android组件安全
- XML转换JSON的工具使用方法
- 为大型网站提速—redis
- Python压缩
- Objective-C 命名规范
- 《BI项目笔记》创建多维数据集Cube(2)
- codeforces 471C.MUH and House of Cards 解题报告
- PLSQL DEVELOPER 连接远程数据库 OCI客户端安装方法
- object-单例设计模式
- PAT 字符串-02 删除字符串中的子串
- CentOS下恢复Firefox的复制等功能
- 传输层-TCP
- ASP.NET MVC 5 学习教程:控制器传递数据给视图
- 【cocos2d-js官方文档】二十五、Cocos2d-JS v3.0中的单例对象
- Pat1067:Sort with Swap(0,*)
- [UNITY 5.4 UGUI] 模态对话框
- uWSGI, Gunicorn, 啥玩意儿?
- flutter 生命周期
- kubernetes高可用设计-CA,etcd
热门文章
- Spring scope注解
- hibernate 创建工厂类
- vs安装体验
- 80C51存储器与C51内存优化
- Beta 冲刺 四
- 移动硬盘插到台式机,外接网卡无法连接wifi处理
- C# 项目迁移 Microsoft.VisualStudio.Tools.Office.BuildTasks 生成解决方法报错:请确认 <;UsingTask>; 声明正确,该程序集及其所有依赖项都可用
- ubuntu 16.04 kdump 使用
- 如何解决每次打开office 都会出现正在配置的问题
- idea log4j 用法