当前位置: 首页 > 工具软件 > Startblog > 使用案例 >

Oracle中Start With的用法

叶鸿煊
2023-12-01

Oracle Start With 关键字

1.问题描述

在主销售品目录模块查询目录节点下的销售品用到此关键字。使用此关键字能够解决层级结构的查询问题。

2. 基本语法

SELECT ... FROM + 表名

WHERE + 条件3 

START WITH + 条件1 

CONNECT BY PRIOR + 条件2

描述:

条件1:
表示从哪个节点开始查找, 也就是通过条件1 查询到的数据, 作为后续查询的起始节点(参数).

当然可以放宽限定条件,如 ID in (‘00001’, ‘00011’)以取得多个根节点,也就是多棵树;在连接关系中,除了可以使用列明外,还允许使用列表达式。

如果省略Start With

就默认把所有满足查询条件的Tree整个表中的数据从头到尾遍历一次,每一个数据做一次根,然后遍历树中其他节点信息.

条件2:
是连接条件,其中用PRIOR表示上一条记录,例如CONNECT BY PRIOR ID = PID,意思就是上一条记录的ID是本条记录的PID,即本记录的父亲是上一条记录。CONNECT BY子句说明每行数据将是按照层次顺序检索,并规定将表中的数据连入树形结构的关系中。

Prior 在父节点的一侧表示, 自底向上查, 在 子节点的一侧表示 自上向下查询;

条件3:
不能用在 Connect By 后, 这里的条件判断, 等价于 在最后查询出结果列表之后, 再进行条件筛选; 并非 删除掉 节点及子节点;

举例
ID, DSC, PID;三个字段, 分别表示 当前标识的 ID(主键), DSC 当前标识的描述, PID 其父级ID, 比较典型的例子 是 国家, 省, 市 这种层级结构;

省份归属于国家, 因此 PID 为 国家的 ID, 以此类推;

--自上向下

 Select * 

From DEMO

Start With ID = '00001'

 --用 Start Wiht PID = '-1' 结果不变 

Connect By Prior ID = PID

--结果 

ID    DSC    PID

00001 中国 -1 

00011 陕西 00001

 00111 西安 00011

 00112 咸阳 00011 

00113 延安 00011 

00012 贵州 00001 

00013 河南 00001

说明

1.查出第一个条件为ID = '00001’的结果:00001 中国 -1
2.

Select * 

From DEMO

Where ID = PID :左边条件为第一步查出来的条件所以为:00001 =PID

所以结果为:00011 陕西 00001

3.循环1、2步直到查出所有

3.其他关键字

nocycle:消除数据本身不合理情况导致的循环。如:中国的ID与PID都为00001时将一直循环。

SIBLINGS: 关键字:它会保护层次,并且在每个等级中按expre排序。

例如:

Select ID, PID, DSC, connect_by_isleaf, LEVEL

From DEMO

Start With ID = '00001' 

Connect By nocycle Prior ID = PID

ORDER SIBLINGS By DSC

相关介绍链接:

https://blog.csdn.net/weiwenhp/article/details/8218091

https://www.cnblogs.com/zyzdisciple/p/7873584.html

 类似资料: