返回首页

gbase数据、南大通用产品文档:GBase8aHierarchical Query

更新日期:2024年09月11日

功能说明
树结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列
之间的关系来描述。通过每个节点的父节点,就可以确定整个树的结构。在

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
| CONNECT BY [START WITH ]
[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 |

使用VisualStudio 安装包选择安装VS 插件时,需确定系统中要确定安装
对应插件的VisualStudio
SDK 组件。在安装界面中会有SDK 确认安装提示,请
看下图。


GBase 8a 程序员手册ADO.NET 篇


- 118 -

南大通用数据技术股份有限公司

如果在不安装SDK 的前提下强制使用插件,将会导致莫名其妙的问题。如:
在SSAS 项目中新建数据源的窗口中点击下拉列表并选择GBase Data Provider
时,会自动关掉窗口。



GBase 8a 程序员手册ADO.NET 篇
南大通用数据技术股份有限公司

- 119 -
13 GBase ADO.NET 的客户端类介绍
本章节介绍了GBase ADO.NET 的客户端类,并且只实现了Microsoft
ADO.NET 的部分类,
如果需要了解除本文档外其余的ADO.NET 的类介绍,
请参考
MSDN 上关于Microsoft ADO.NET 类的相关介绍。
GBase ADO.NET 的客户端类

描 述
GBaseConnection
代表一个与GBase 服务器数据库连接。
这个类不能被继承。
GBaseCommand
代表一个要对GBase 数据库执行操作
的SQL 语句,这个类不能被继承。
GBaseCommandBuilder
可以创建GBaseCommandBuilder 对象
来自动生成针对单个表操作的SQL 语
句,此类不能被继承。
GBaseDataAdapter
GBaseDataAdapter
是 DataSet

GBase 数据库之间的桥接器,用于检索
和保存数据。此类不能被继承。
GBaseDataReader
代表GBase 数据源中只进且只读的数
据流,此类不能被继承。
GBaseError
提供由服务器返回的错误代码参考。
GBaseException
返回错误时抛出的异常。
这个类不能被
继承。
GBaseHelper
帮助类,
使用GBase
ADO.NET 对象封装,
使得操作GBase 数据源更加方便。
GBaseInfoMessageEventArgs
提供用于InfoMessage 事件的数据。

个类不能被继承。
GBaseParameter
代表一个传给GBaseCommand 的参数。
这个类不能被继承。
GBaseParameterCollection
代表一个关于GBaseCommand 的参数以
及和参数对应的DataSet 中列的集合。

GBase 8a 程序员手册ADO.NET 篇


- 120 -

南大通用数据技术股份有限公司

描 述
这个类不能被继承。
GBaseRowUpdatedEventArgs
提供用于RowUpdated 事件的数据。这
个类不能被继承。
GBaseRowUpdatingEventArgs
提供用于RowUpdating 事件的数据。

个类不能被继承。
GBaseTransaction
代表一个GBase 数据库中的事务。
这个
类不能被继承。
GBaseIpAutoRoute
集群高可用实现类,
此类为静态不能被
继承。
GBaseLoadBalance
集群负载均衡实现类,
此类为不静态不
能被继承。
GBaseConnectionSettingCommon
集群高可用和负载均衡新增类,
负责解
析Settings 中关于高可用性关键字的
类。此类不能继承。
对象事件
委 托
描 述
GBaseInfoMessageEventHandler
代表处理
GBaseConnection

InfoMessage 事件的方法。
GBaseRowUpdatedEventHandler
代表处理
GBaseDataAdapter

RowUpdated 事件的方法。
GBaseRowUpdatingEventHandler
代表处理
GBaseDataAdapter

RowUpdating 事件的方法。
GBaseDbType
指定用于 GBaseParameter 的字段,
属性的GBase 特殊数据类型。
GBase ADO.NET 的数据类型的枚举类
枚 举
描 述
GBaseDbType
指定用于 GBaseParameter 的字段,
属性的GBase 特殊数据类型。



GBase 8a 程序员手册ADO.NET 篇
南大通用数据技术股份有限公司

- 121 -

概述
GBase 8a MPP Cluster 支持集群扩容、集群缩容、集群节点替换等功能,满足在集
群运行过程中需要存储的数据增加导致数据存储空间不足,
长时间运行导致单节点
硬件故障,整体集群需要进行硬件升级等场景。
V9.5.3 当前不支持gcware 节点的扩容和缩容,支持gcware 节点替换。