oracle 级联查询 根路径
级联查询有很多教程示例,但是没有找到求特定子孙到根的路径的例子,折腾了一番总算想出方法了。
现假设我们拥有一个菜单表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,再和原表左联。如有更好的方法,欢迎交流
oracle 级联查询 根路径的更多相关文章
- Oracle级联查询
在ORACLE 数据库中有一种方法可以实现级联查询 select * //要查询的字段 from table //具有子接点ID与父接点I ...
- 【转】 oracle 层次查询判断叶子和根节点
Oracle 9i判断是叶子或根节点,是比较麻烦的一件事情,SQL演示脚本如下: DROP TABLE idb_hierarchical; create TABLE idb_hierarchical ...
- oracle使用connect by进行级联查询 树型菜单
Oracle使用connect by进行级联查询 树型菜单(转) connect by可以用于级联查询,常用于对具有树状结构的记录查询某一节点的所有子孙节点或所有祖辈节点. 来看一个示例,现假设我们拥 ...
- ORACLE 数据库的级联查询 一句sql搞定(部门多级)
在ORACLE 数据库中有一种方法可以实现级联查询 select * //要查询的字段 from table //具有子接点ID与父接点I ...
- Oracle树查询总结
最近在做公司的项目中遇到一个问题,多级级联导航菜单,虽然只有三级目录,但<li>中嵌套<ul>,数据库表结构如下: CREATE TABLE FLFL ( ID NUMBER ...
- Oracle树查询及相关函数
Oracle树查询的最重要的就是select...start with... connect by ...prior 语法了.依托于该语法,我们可以将一个表形结构的中以树的顺序列出来.在下面列述了Or ...
- 树概念及使用connect by进行级联查询
树 树,大家都见过,以这种形式的数据关系,就是树.下面看一张图,了解什么是根节点(树干).节点或分叉.叶(叶节点) connect by 级联查询 connect by可以用于级联查询,常用于对具有树 ...
- Oracle 层次查询 connect by
oracle 层次查询 语法: SELECT ... FROM [WHERE condition] --过 ...
- oracle 常用查询语句
一.一般日常用的脚本 1.检查源库每个节点至少3组redoselect group#,thread#,bytes/1024/1024,members,status from v$log; select ...
随机推荐
- # 蜗牛慢慢爬 LeetCode 21. Merge Two Sorted Lists [Difficulty: Easy]
题目 Merge two sorted linked lists and return it as a new list. The new list should be made by splicin ...
- Linux命令(二十一) 改变文件所有权 chown 和 chgrp
目录 1.命令简介 2.常用参数介绍 3.实例 4.直达底部 命令简介 一个文件属于特定的所有者,如果更改文件的属主或属组可以使用 chown 和 chgrp 命令. chown 命令可以将文件变更为 ...
- 【刷题】LOJ 6004 「网络流 24 题」圆桌聚餐
题目描述 假设有来自 \(n\) 个不同单位的代表参加一次国际会议.每个单位的代表数分别为 \(r_i\) .会议餐厅共有 \(m\) 张餐桌,每张餐桌可容纳 \(c_i\) 个代表就餐. 为了使 ...
- 【题解】 [HNOI2015]落忆枫音 (拓扑排序+dp+容斥原理)
原题戳我 Solution: (部分复制Navi_Aswon博客) 解释博客中的两个小地方: \[\sum_{\left(S是G中y→x的一条路径的点集\right))}\prod_{2≤j≤n,(j ...
- 【转】SPI总线协议
SPI总线协议 By Xiaomin | April 17, 2016| 技术 概述 SPI(Serial Peripheral Interface)总线是主要应用于嵌入式系统内部通信的串行同步传输总 ...
- bzoj2456 mode (思路)
不能把数存下来. 于是来打擂台,如果新数和他不相等,cnt--,否则cnt++.如果cnt<=0了,那个新数就来把它顶掉,然后把cnt重置成1 最后在台上的就是那个次数大于N/2的众数 (连&l ...
- emoji表情存储到数据库的方法
方案1:修改数据库编码 为什么我们设置表的的字符类型为utf8却不能存放emoji呢?原来utf8可能是2或3或4个字节,而mysql的utf8是3个字节,存放一个emoji是需要4个字节的,自然不够 ...
- 解题:HAOI 2015 按位或
题面 Min-Max容斥:对于集合S $min(S)=\sum_{s∈S}(-1)^{|s|+1}max(s)$ $max(S)=\sum_{s∈S}(-1)^{|s|+1}min(s)$ 那么这个题 ...
- C/C++如何整行读入字符串?
在写代码的过程中,经常要一行一行的读入字符串进行处理,这里我总结了一些方法,供大家参考. 方法一:scanf()读入char[] 使用方法: ]; scanf("%[^\n]",& ...
- Python基础学习(三)
了解了Python的基础使用,接下来继续练手廖雪峰老师的教学案例. 一.变量可以指向函数 说明,一个函数可以赋值给一个变量,该变量就会具有该函数的功能,举例: gg = abs print( gg(- ...