oracle 层次化查询(生成菜单树等)

1、简介:Oracle层次化查询是Oracle特有的功能实现,主要用于返回一个数据集,这个数据集存在树的关系(数据集中存在一个Pid记录着当前数据集某一条记录的Id)。

2、层次化查询主要包含两个子句,一个start with另一个是connect by。

start with:这个子句一般用于指定层次化查询的开始节点(也就是树的最顶级节点),找到最顶级节点,然后按照一定的规则开始查找其剩余的子节点

connect by:这个子句就是上面所说的规则,用于查找剩余子节点的规则

CREATE TABLE MENU
(    "ID" NUMBER,
    "DATA" VARCHAR2(100),
    "PID" NUMBER
)
insert into MENU (id, data, pid)values (7, ‘g‘, 3);
insert into MENU (id, data, pid)values (1, ‘a‘, null);
insert into MENU (id, data, pid)values (2, ‘b‘, null);
insert into MENU (id, data, pid)values (3, ‘c‘, 2);
insert into MENU (id, data, pid)values (4, ‘d‘, 2);
insert into MENU (id, data, pid)values (5, ‘e‘, 4);
insert into MENU (id, data, pid)values (6, ‘f‘, 1);

下面开始执行层次化查询,从PId为null的节点(该节点为根节点)开始递归查找,查找出所有的更节点下的子节点,构建出一个完整的树

select ID,DATA,nvl(TO_CHAR(PID),‘NULL‘) from menu start with PID is NULL connect by prior ID=pid

代码解析:

(1)、start with PID is NULL  指定层次化查询的根节点,

红框内的两个节点为根节点,并开始遍历其余的节点。

(2)、connect by prior ID=pid  当前节点的PID等于上一层节点的ID,如果满足条件,就加入到树结果集中

指定遍历查找子节点的规则----->  这一过程是递归查找,会一层一层找下去,直到不符合这一规则,则查找停止。

3、实现上面结果集的另一种Sql实现

select ID,DATA,nvl(TO_CHAR(PID),‘NULL‘) from menu start with (data=‘a‘ or data=‘b‘) connect by prior ID=PID

结论:根节点的定义比较灵活,但是(connect by)遍历子节点的规则,比较固定基本都是判断父节点和子节点的ID的,如果理解了这句话,层次化查询,差不多也就理解了!

4、  Oracle SQL 中的层次化查询会检测数据中是否存在回环(死循环),如果存在回环,则会抛出 ORA-01436: CONNECT BY loop in user data . 的错误。如果在 connect by 后面加上 nocycle 则 产生回环的最后一层的节点会被删除。

如果数据中出现这种情况,产生了回环,那么在connect by 后面 加nocycle,节能

select ID,DATA,nvl(TO_CHAR(PID),‘NULL‘) from menu start with (data=‘a‘ or data=‘b‘) connect by nocycle prior ID=PID 

just没有报错,有点郁闷,并没有删除,不知道哪里出了问题,但是至少不抱错了!!!

5、Oracle 还为层次化查询提供了一些伪列( Pseudo Column )。

(1)、CONNECT_BY_ISCYCLE 当这一行有一个子节点同时也是它的祖先节点时返回 1 ,否则返回 0 。

(2)、CONNECT_BY_ISLEAF 当这一行是叶节点时返回 1 ,否则返回 0 。伪列 LEVEL 返回这一行在树中的层次,根为第一层。

(3)、CONNECT_BY_ROOT 查询操作符可以加在 connect by 之后的某个字段之前,表示获得这一行的根节点的该字段的值。

6、层次化查询还支持一个特殊的函数 SYS_CONNECT_BY_PATH , SYS_CONNECT_BY_PATH ( exp , char ),这个函数返回从根节点到这一行计算其中每个exp 表达式的值,并把它们连接成字符串,每个节点之间用 char 字符来分割。下面是一个例子。

这个函数很棒,可以考虑其他的数据库也实现这个方法,这样我们处理一个树结构就很方便了!!!

时间: 2025-01-31 07:02:06

oracle 层次化查询(生成菜单树等)的相关文章

Oracle层次化查询

--====================================================== --SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR) --====================================================== 层次化查询,即树型结构查询,是SQL中经常用到的功能之一,通常由根节点,父节点,子节点,叶节点组成,其语法如下: SELECT [LEVEL] ,column,expressio

java从数据库读取菜单,递归生成菜单树

首先看一下菜单的样子 根据这个样子我们定义菜单类 public class Menu { // 菜单id private String id; // 菜单名称 private String name; // 父菜单id private String parentId; // 菜单url private String url; // 菜单图标 private String icon; // 菜单顺序 private int order; // 子菜单 private List<Menu> chi

●oracle——层次化查询

/* start with--以gb.no='110000'为根节点 connect by--指定父行和子行之间的关系 prior--该关键字之后的表达式将被作为查询中当前列的父列进行计算, 即该关键字后的列为父行的列.该关键字不限制是否在等号左侧 level--该列用来表示查询层次整型值 */ select level, gb.no, gb.name_full, gb.parent from sfsc.dr_area_gb gb start with gb.no = '110000' conn

递归加载菜单树

1.创建数据库表 create table system_resource ( id bigint(11) not null primary key auto_increment comment 'id', resource_name varchar(20) not null comment '资源名称', resource_name_cn varchar(20) not null comment '资源中文名', resource_parent_name varchar(20) null co

ORACLE 树形查询 树查询

前台树结构依据个人的权限登录变化 全部我查询要依据 树的ID 查询以下全部的子节点 以及本节点的信息 select * from table start with id = #{id} connect by prior id = pid 这里的id就是 父节点的ID

SQL基础--&amp;gt;层次化查询(START BY ... CONNECT BY PRIOR)

--====================================================== --SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR) --====================================================== 层次化查询,即树型结构查询,是SQL中经经常使用到的功能之中的一个,通常由根节点,父节点,子节点,叶节点组成,其语法例如以下: SELECT [LEVEL] ,column,ex

数据库编程3 Oracle 子查询 insert update delete 事务 回收站 字段操作 企业级项目案例

[本文谢绝转载原文来自http://990487026.blog.51cto.com] <大纲> 数据库编程3 Oracle 子查询 insert update delete 事务 回收站 字段操作 企业级项目案例 实验所用数据表 子查询,解决一步不能求解 查询工资比scott高的员工信息: 子查询知识体系搭建: 解释3,查询部门是sales的员工信息: 方法1:子查询 [方法2]:多表: 优化考虑: 解释4[select],只能放单行子查询 解释4[from] 考题:显示员工姓名,薪水 解释

ORACLE AWR报告生成步骤

ORACLE AWR报告生成步骤 (以PL/SQL中命令窗口为例) 1.sqlplus或plsql的commod窗口(命令窗口)运行命令 @D:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\awrrpt.sql; -- 具体地址,需要查询得到 --然后在弹出的对话框中输入选择的导出格式html或者txt,一般用html,生成的报告用浏览器查看比较方便. 2.在弹出的对话框中输入数字选择制定选择快照的数量 3.在接下来弹出的对话框中分别选择最小和最大snap_id

WPF+通过配置文件生成菜单(Menu)+源码

这个月做项目,遇到过一个通过配置文件来生成菜单的解决方案,感觉挺优雅的,特地放到博客园来,以飨读者. 说来惭愧,以前做的项目都没有这样用过,都是固定死了.如果后续有需要加入菜单,还得在重新修改UI,然后提交code,才OK.但是如果通过配置文件的方式进行操作,则可以不用动code,只需要修改配置文件即可. 有兴趣的可以往下看,不难,很简单!~ 先看下这次demo的结构: 1.生成XML式的配置文件菜单项.. 我用XML格式来存储, <MenuList xmlns:xsi="http://w