关系型数据库中,通过一个数据表中的记录具有相同的列,因此不同的记录之间存在平行关系。有时,各记录之间也可能存在“父子”关系。当这些“父子”关系较为复杂时,可以将整个表中的数据看做树状结构,而基于树状结构数据的查询,称为层次化查询。层级化查询在表对象中存在“父子”依赖的层级上的设置递归查询条件。
select_statement [START WITH condition ] CONNECT BY [ NOCYCLE ] [ PRIOR ] condition
使用方法
START WITH
是根结点的限定语句,即遍历的起始条件,指定查询开始的数据行。也可以放宽限定条件,以遍历多个根结点,实际就是多棵树。
CONNECT BY
连接条件,用于指定父数据行和子数据行之间的关系,结合PRIOR使用。比如CONNECT BY PRIOR staff_id=manager_id是指下一条记录staff_id是上一条记录的manager_id。
NOCYCLE
即使数据中存在CONNECT BY死循环时,NOCYCLE参数也会指示数据库从查询中返回行。
产生死循环的原因:
比如查找数据发现,数据region_id为1的parent_id为24684,而region_id为24684的parent_id为1,这样就产生了死循环。将数据校正后,将会运行正常。
PRIOR
prior是一个一元操作符,和+、-符号具有相同优先级。
prior放在等号的左边或者右边决定了检索是自下向上还是自上向下的。例如CONNECT BY PRIOR area_id=country_id,prior放在等号左边,跟子节点列area_id放在一起,就是往叶子节点方向遍历,即自顶向下查找。如果改成CONNECT BY country_id= PRIOR are_id就是往父结点area_id方向遍历,即自下向上遍历。
当CONNECT BY后指定多个连接条件时,每个条件都应指定PRIOR关键字。
CONNECT_BY_ISCYCLE伪列
如果当前行有一个子行,且子行又是当前行的祖先行,CONNECT_BY_ISCYCLE返回1,否则返回0。
CONNECT_BY_ISLEAF伪列
如果当前行是CONNECT BY条件定义树的叶子节点,CONNECT_BY_ISLEAF伪列返回1,否则返回0。该信息也表明了一个给定的行是否可以进一步扩张,表现出更多的层次。
LEVEL伪列
层级查询返回的每一行,跟节点行LEVEL伪列返回1,跟节点的子节点行LEVEL为例返回2等等。跟节点行是倒置树的最高行。子节点行是任意非跟节点行。父节点行是任意有子节点的行。叶子节点行是任意没有子节点行。