功能说明
树结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列
之间的关系来描述。通过每个节点的父节点,就可以确定整个树的结构。在
GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
1079
SELECT 命令中使用START WITH...CONNECT BY 可以查询表中的树形结构关
系。
分层查询通过CONNECT BY 进行递归,
若探测到cycle,
GBase 8a MPP Cluster
默认会报错退出;
若用户指定NOCYCLE,
GBase 8a MPP Cluster 会返回发生cycle
之前的已查询记录。
语法格式
START WITH...CONNECT BY 语法形式:
SELECT column_list|[LEVEL]
FROM [[vc_name.]database_name.]single_table
[WHERE …]
[hierarchical_clause]
[GROUP BY …]
[ORDER [SIBLINGS] BY …]
hierarchical_clause :
[START WITH
| CONNECT BY
[ORDER SIBLINGS BY {col_name | expr | position} [ASC | DESC] , ...]
connect_condition:
PRIOR expr1 op expr2
| expr1 op PRIOR expr2
| expr op connect_condition
| expr
表5- 102 参数说明
参数名称
说
明
LEVEL
伪列,由GBase 8a MPP Cluster 自动维
护;用于标识分层查询结果所在层级,
从1 开始。
START WITH
START WITH 后面的condition 标识分
层查询的所有root rows,
START WITH
子句可以省略。
CONNECT BY
CONNECT BY 后面的condition 标识
parent row 和child row 之间的连接
condition;condition 中的表达式中需要
通过PRIOR 指定该表达式涉及的列出
自parent row 还是child row。如:
... PRIOR expr_left = expr_right
//左表
达式中涉及的列出自parent row;
... expr_left = PRIOR expr_right
//右表
达式中涉及的列出自parent row;
GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
1080
参数名称
说
明
PRIOR
一元操作符,仅用于CONNECT BY 后
面的condition,
用于标识紧接在后面的
表达式中涉及的列出自parent row。
PRIOR 只对于紧接在后面的表达式生
效,如下例:
expr_1 = expr_2 AND expr_3 = PRIOR
expr_4
//PRIOR 只对于expr_4 生效。
PRIOR 不能嵌套使用,如下例会报错:
PRIOR (expr_1 + PRIOR expr2)
CONNECT_BY_ROOT
一元操作符,
用于获取结果集中每一条
记录对应根记录的某一列值。
参数可以
指定多列、表达式或函数。不能出现在
connect_condition 和join_condition 中。
connect_by_isleaf
伪列,由GBase 8a 自动维护;用于表
示当前层已经是最后一层。0 表示非最
后一层;1 表示最后一层。不能出现在
connect_condition 和join_conditions 中。
connect_by_iscycle
伪列,由GBase 8a 自动维护。用于表
示当前层是否发生cycle。
0 表示未发生
cycle ;1 表示发生cycle 。只有
NOCYCLE 存在才能使用,否则报错。
SYS_CONNECT_BY_PATH(column,char)
函数,
可通过使用指定的字符作为连接
符,
将分层查询结果的某一列按照分层
路径输出。不能出现在
connect_condition 和join_conditions 中。
Where
Where 子句中所有连接条件均在
hierarchical_clause 之前执行,
所有过滤
条件均在hierarchical_clause 之后执行
GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
1081
说明
分级查询子句connect by 与start with 不允许出现外层表的列;
分级查询from 子句必须是表,且必须是复制表;
分级查询可以作为子查询出现,但分级查询中不允许出现子查询;
connect by 关联条件不能包含or 操作,并且必须包含父子节点间的等值条
件,等号的两边必须是不同的维度(一边包含prior,一边不包含prior);
prior 是一元操作符,优先级同正负号,只能用在connect by 子句中;prior
后面不可以接伪列(level、rowid 等)、不可以接包含伪列的表达式、不
可以嵌套使用prior、不可以接聚合函数;
order siblings by 只能用在分级查询语句中,
并且不能同聚合、
OLAP 函数、
ORDER BY 同时存在;
不支持实时环路判断,
只能保证最终能够检测出环路,
如果数据量太大
(如
超过十万),会耗时很长才能检测出;
最大节点数为MAX_INT(2147483647)(所有节点数);
新增三个保留字:start、level、prior;
CONNECT BY 后面的condition 不允许包含subquery;
示例
示例1:level 使用在CONNECT BY 位置。
USE test;
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(a int, b int, c char(10), d varchar(20), e varchar(5), f
datetime, g decimal(6,2)) REPLICATED;
INSERT INTO t1 VALUES(0,1,'DMD','kds','dmd','2013-4-1 10:23:01',1.1);
INSERT INTO t1 VALUES(0,3,'DMD','cj','dmd','2013-4-1 10:23:01',2.1);
INSERT INTO t1 VALUES (1,3,'DMD','lm','dmd1','2013-4-1 10:23:01',2.2);
INSERT INTO t1 VALUES (1,4,'DMD','zx','dmd2','2013-4-1 10:23:01',2.3);
DROP TABLE IF EXISTS t2;
CREATE TABLE t2 REPLICATED AS SELECT * FROM t1;
gbase> SELECT level, t1.* FROM t1 CONNECT BY NOCYCLE PRIOR b =
level START WITH a = 0;
+-------+------+------+------------+------+------+---------------------+------+
| level | a
| b
| c
| d
| e
| f
| g
|
+-------+------+------+------------+------+------+---------------------+------+
|
1 |
0 |
1 | DMD
| kds
| dmd
| 2013-04-01 10:23:01 |