GBase 8a MPP 分级查询

在关系数据库中,如果数据之间是等级关系(也称树状结结构或层次结构),需要按照一定的层次间顺序遍历出这种等级关系数据,称之为分级查询。在日常生活中有很多数据都是有层次关系的,如组织架构、家族关系等,都可以采用分级查询来实现。

下面针对8a的分级查询进行简单的介绍:

一、语法说明

分级查询的语法形式如下:

SELECT [DISTINCT] select_expr, ...

FROM table_faction

[WHERE where_condition]

hierarchical_query_clause

[GROUP BY {col_name | expr | position}

[ASC | DESC], ... ]

[HAVING where_condition]

[order_by_clause]

[limit_clause]

select_expr:

指查询投影列,可以使用as来为投影列命名别名

注:可以使用伪列level、connnect_by_isleaf、connect_by_iscycle和sys_connect_by_path,或基于level、connnect_by_isleaf、connect_by_iscycle和sys_connect_by_path的表达式,如abs(level)、level+1、sys_connect_by_path(a,‘/’)、sys_connect_by_path(a+b,’/’)等

table_faction:

table_joins | tables

注:必须为复制表,包括复制表的join,from子查询(子查询的表也必须是复制表)

hierarchical_query_clause:

[START WITH <join_conditions>] CONNECT BY [NOCYCLE] <connect_conditions>

|CONNECT BY [NOCYCLE] <connect_conditions> [START WITH <join_conditions>]

[ORDER SIBLINGS BY {col_name | expr | position } [ASC | DESC], ... ]

connect_conditions:

connect_condition [AND connect_condition ...]

connect_condition:

PRIOR expr1 op expr2

| expr1 op PROR expr2

|expr op connect_condition

|expr

键字说明:

1) start with:根数据的位置,即遍历的起始条件等同于on后面的连接条件,用于标识分级查询的所有记录。Start with子句若省略则表示结果集中的每一条数据均为根数据。

2) connect by:层级的条件关系 即父节点与子节点的连接关系。该条件中必须有prior操作符。如:PRIOR expr = expr or expr = PRIOR expr,其中prior修饰谁,谁就是子节点。

3) nocycle:允许查询中存在cycle的标记

二、支持的伪例

1. Level:伪列,由GBase8a自动维护,用于标识分级查询结果所在层级,从1开始。

eg:select level, partenid, id from t start with parentid = ’北京’ connect by prior id = parentid ;

+----------+------------------+-----------------------+

|  level  |   parentid   |  id            |

+----------+------------------+-----------------------+

|     1  |中国        | 北京           |

|     2  | 北京       | 海淀区         |

|     3  | 海淀区     | 北京大学       |

|     3  | 海淀区     | 清华大学       |

|     3  | 海淀区     | 中国人民大学   |

|     2  | 北京       | 朝阳区         |

|     3  | 朝阳区     | 北京工业大学   |

+----------+------------------+-----------------------+

2. connect_by_isleaf:伪列,是否为叶子节点(无子节点)

eg:select connect_by_isleaf, partenid, id from t start with parentid = ’北京’ connect by prior id = parentid ;

+--------------------------+------------------+-----------------------+

|  connect_by_isleaf  |   parentid   |  id            |

+--------------------------+------------------+-----------------------+

|               0  | 中国        | 北京           |

|               0  | 北京        | 海淀区         |

|               1  | 海淀区      | 北京大学       |

|               1  | 海淀区      | 清华大学       |

|               1  | 海淀区      | 中国人民大学   |

|               0  | 北京        | 朝阳区         |

|               1  | 朝阳区      | 北京工业大学   |

+--------------------------+------------------+-----------------------+

3. connect_by_iscycle:是否为循环节点(检测到子节点值和祖先节点有重复,则认为是循环节)

eg:select connect_by_iscycle partenid, id from t start with parentid = ’北京’ connect by nocycle prior id = parentid ;

+----------------------------+------------------+-----------------------+

|  connect_by_iscycle  |   parentid   |  id            |

+----------------------------+------------------+-----------------------+

|                 0  | 中国        | 北京           |

|                 0  | 北京        | 海淀区         |

|                 0  | 海淀区      | 北京大学       |

|                 0  | 海淀区      | 清华大学       |

|                 0  | 海淀区      | 中国人民大学   |

|                 0  | 北京        | 朝阳区         |

|                 0  | 朝阳区      | 北京工业大学   |

+----------------------------+------------------+-----------------------+

三、支持的操作符

1. prior:一元操作符,仅用于connect by后面的connect_condition,用于标识紧接在后面的表达式中涉及的列出自服记录,即修饰谁就是谁是子节点。Prior只对于紧接在后面的表达式生效,且不支持嵌套。

... prior expr_left = expr_right  //左表达式中涉及的列出自parent row

... expr_left = prior expr_right  //右表达式中涉及的列出自parent row

... expr_1 =expr_2 and expr_3 = prior expr_4 //prior只对expr_4有效

... prior(expr_1 + prior expr_2)  //不支持嵌套,报错

eg:select partenid, id from t start with parentid = ’北京’ connect by prior id = parentid ;

+-----------------+-----------------------+

|   parentid   |  id            |

+-----------------+-----------------------+

| 中国       | 北京           |

| 北京       | 海淀区         |

| 海淀区     | 北京大学       |

| 海淀区     | 清华大学       |

| 海淀区     | 中国人民大学   |

| 北京       | 朝阳区         |

| 朝阳区     | 北京工业大学   |

+-----------------+-----------------------+

select partenid, id from t start with parentid = ’北京’ connect by id = prior parentid ;

+-----------------+-----------------------+

|   parentid   |  id            |

+-----------------+-----------------------+

| 中国       | 北京           |

+-----------------+-----------------------+

2. connect_by_root:一元操作符,用于获取结果集中每条记录对应根记录的某一列值,该列通过紧接在connect_by_root后面的字段进行标识。

eg:select partenid, id, connect_by_root(parentid) from t start with parentid = ’北京’ connect by prior id = parentid ;

+-----------------+-----------------------+-------------------------------------+

|   parentid   |  id            |  connect_by_root(parentid)  |

+-----------------+-----------------------+-------------------------------------+

| 中国       | 北京           |  中国                    |

| 北京       | 海淀区         |  中国                    |

| 海淀区     | 北京大学       |  中国                    |

| 海淀区     | 清华大学       |  中国                    |

| 海淀区     | 中国人民大学   |  中国                    |

| 北京       | 朝阳区         |  中国                    |

| 朝阳区     | 北京工业大学   |  中国                    |

+-----------------+-----------------------+-------------------------------------+

四、支持的函数

1. sys_connect_by_path(column,char):可通过使用指定的字符作为连接符,将分级查询结果的某列按照分级路径输出。

eg: select partenid, id, sys_connect_by_path(id,’/’) from t start with parentid = ’北京’ connect by prior id = parentid ;

+-----------------+-----------------------+-------------------------------------------------+

|   parentid   |  id            |  sys_connect_by_path(id,’/’)         |

+-----------------+-----------------------+-------------------------------------------------+

| 中国       | 北京           |  /北京                           |

| 北京       | 海淀区         |  /北京/海淀区                    |

| 海淀区     | 北京大学       |  /北京/海淀区/北京大学            |

| 海淀区     | 清华大学       |  /北京/海淀区/清华大学            |

| 海淀区     | 中国人民大学   |  /北京/海淀区/中国人民大学        |

| 北京       | 朝阳区         |  /北京/朝阳区                    |

| 朝阳区     | 北京工业大学   |  /北京/朝阳区/北京工业大学        |

+-----------------+-----------------------+-------------------------------------------------+

五、支持分级排序

1. order siblings by:分级查询中兄弟间的排序。按key值顺序遍历数据,遍历规则是树的深度优先遍历中的先序遍历。不能和聚合函数一起使用。

eg:select partenid, id from t start with parentid = ’北京’ connect by prior id = parentid order siblings by id asc ;

+-----------------+-----------------------+

|   parentid   |  id            |

+-----------------+-----------------------+

| 中国       | 北京           |

| 北京       | 朝阳区         |

| 朝阳区     | 北京工业大学   |

| 北京       | 海淀区         |

| 海淀区     | 中国人民大学   |

| 海淀区     | 北京大学       |

| 海淀区     | 清华大学       |

+-----------------+-----------------------+

select partenid, id from t start with parentid = ’北京’ connect by prior id = parentid order siblings by id desc ;

+-----------------+-----------------------+

|   parentid   |  id            |

+-----------------+-----------------------+

| 中国       | 北京           |

| 北京       | 海淀区         |

| 海淀区     | 清华大学       |

| 海淀区     | 北京大学       |

| 海淀区     | 中国人民大学   |

| 北京       | 朝阳区         |

| 朝阳区     | 北京工业大学   |

+-----------------+-----------------------+

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值