暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

华为GaussDB T START WITH CONNECT BY LEVEL

原创 章芋文 2019-10-03
586

关系型数据库中,通过一个数据表中的记录具有相同的列,因此不同的记录之间存在平行关系。有时,各记录之间也可能存在“父子”关系。当这些“父子”关系较为复杂时,可以将整个表中的数据看做树状结构,而基于树状结构数据的查询,称为层次化查询。层级化查询在表对象中存在“父子”依赖的层级上的设置递归查询条件。

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等等。跟节点行是倒置树的最高行。子节点行是任意非跟节点行。父节点行是任意有子节点的行。叶子节点行是任意没有子节点行。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论