在主销售品目录模块查询目录节点下的销售品用到此关键字。使用此关键字能够解决层级结构的查询问题。
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步直到查出所有
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
相关介绍链接: