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

华为GaussDB T 层级化查询

墨天轮 2019-10-12
848

层级化查询

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

例如,假设一个公司在全球各大城市有分公司,如树状图下图所示。

图1 分公司城市树状图

语法格式

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

示例

在表country中,欧洲的所有的分公司所在国家(请参见图1)。
--删除表country。 DROP TABLE IF EXISTS country;
--创建表country。 CREATE TABLE country ( area_id INT NOT NULL, area_name VARCHAR(30), country_id INT NOT NULL, country_name VARCHAR(30) );
--插入记录。 INSERT INTO country VALUES(1, 'NSA', 21, 'Mexico'); INSERT INTO country VALUES(1, 'NSA', 22, 'USA'); INSERT INTO country VALUES(1, 'NSA', 23, 'Brazil'); INSERT INTO country VALUES(2, 'EU', 24, 'Canada'); INSERT INTO country VALUES(2, 'EU', 25, 'Italy'); INSERT INTO country VALUES(2, 'EU', 26, 'Britain'); INSERT INTO country VALUES(3, 'AS', 27, 'Japan'); INSERT INTO country VALUES(3, 'AS', 28, 'China'); INSERT INTO country VALUES(3, 'AS', 29, 'Singapore'); COMMIT;
--使用START WITH子句查询,公司在欧洲的所有的分公司所在国家。 SELECT area_name, country_name FROM country START WITH area_id=2 CONNECT BY PRIOR area_id=country_id;
AREA_NAME COUNTRY_NAME ------------------------------ ------------------------------ EU Canada EU Italy EU Britain 3 rows fetched.
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论