返回首页

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

更新日期:2024年09月11日

语法格式
树结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列之
间的关系来描述。通过每个节点的父节点,就可以确定整个树的结构。在SELECT
命令中使用START WITH...CONNECT BY 可以查询表中的树形结构关系,其语法
格式如下。
START WITH...CONNECT BY 语法形式:
SELECT column_list|[LEVEL]
FROM 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
参数说明

START WITH 后面的condition 标识分层查询的所有root rows,START WITH
子句可以省略。

PRIOR 为一元操作符,仅用于CONNECT BY 后面的condition,用于标识紧接
在后面的表达式中涉及的列出自parent row。

CONNECT BY 后面的condition 标识parent row 和child row 之间的连接
condition;
condition 中的表达式中需要通过PRIOR 指定该表达式涉及的列出自
parent row 还是child row,如下例:

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 710
... PRIOR expr_left = expr_right //左表达式中涉及的列出自parent row;
or
... expr_left = PRIOR expr_right //右表达式中涉及的列出自parent row;
PRIOR 只对于紧接在后面的表达式生效,如下例:
expr_1 = expr_2 AND expr_3 = PRIOR expr_4 //PRIOR 只对于expr_4 生效。
PRIOR 不能嵌套使用,如下例会报错:
PRIOR (expr_1 + PRIOR expr2)

CONNECT_BY_ISCYCLE: 伪列,由GBase UP 自动维护。用于表示当前层是
否发生cycle。0 表示未发生cycle;1 表示发生cycle。只有NOCYCLE 存在才
能使用,否则报错

LEVEL:伪列,由GBase UP 自动维护;用于标识分层查询结果所在层级,从
1 开始。

CONNECT_BY_ISLEAF: 伪列,
由GBase UP 自动维护;
用于表示当前层已经
是最后一层。
0 表示非最后一层;
1 表示最后一层。
不能出现在connect_condition
和join_conditions 中。

CONNECT_BY_ROOT: 一元操作符,用于获取结果集中每一条记录对应根记
录的某一列值。参数可以指定多列、表达式或函数。不能出现在
connect_condition 和join_condition 中。

SYS_CONNECT_BY_PATH(column,char): 函数,
可通过使用指定的字符作为连
接符,将分层查询结果的某一列按照分层路径输出。不能出现在
connect_condition 和join_conditions 中。

WHERE: Where 子句中所有连接条件均在hierarchical_clause 之前执行,所有
过滤条件均在hierarchical_clause 之后执行

语法约束:
1) 分级查询子句connect by 与start with 不允许出现外层表的列;
2) 分级查询from 子句必须是表,且必须是复制表;
3) 放到分级查询可以作为子查询出现,但分级查询中不允许出现子查询;
示例1:允许分级查询做子查询:
gbase> select * from (select * from r1 start with id2 = 2 connect by prior
id2 = id2) x;
示例2: 不允许分级查询中出现子查询:
gbase>select
*
from
r1
where
exists
(select
1
from
x2)
start
with
id2
=
2
connect
by prior id2 = id2;
ERROR 1149 (42000): (GBA-02SC-1001) Subquery in hierarchical query is not
allowed

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 711
4) connect by 关联条件不能包含or 操作,并且必须包含父子节点间的等值条
件,等号的两边必须是不同的维度(一边包含prior,一边不包含prior);

5) prior 是一元操作符,优先级同正负号,只能用在connect by 子句中;prior
后面不可以接伪列(level、rowid 等)、不可以接包含伪列的表达式、不可
以嵌套使用prior,不可以接聚合函数;
6) order siblings by 只能用在分级查询语句中,
并且不能同聚合,olap 函数,order
by 同时存在;
7) 不支持实时环路判断,
只能保证最终能够检测出环路,
如果数据量太大
(如
超过十万),会耗时很长才能检测出;
8) 最大节点数为MAX_INT(2147483647)(所有节点数);
9) 新增三个保留字:start level prior;
10)
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,2,'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;
level 使用在CONNECT BY 位置:
gbase> SELECT level, t1.* FROM t1 CONNECT BY 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 | 1.10 |
| 1 | 0 | 2 | DMD | cj | dmd | 2013-04-01 10:23:01 | 2.10 |
| 2 | 0 | 1 | DMD | kds | dmd | 2013-04-01 10:23:01 | 1.10 |
| 2 | 0 | 2 | DMD | cj | dmd | 2013-04-01 10:23:01 | 2.10 |
| 2 | 1 | 3 | DMD | lm | dmd1 | 2013-04-01 10:23:01 | 2.20 |
| 3 | 0 | 1 | DMD | kds | dmd | 2013-04-01 10:23:01 | 1.10 |
| 3 | 0 | 2 | DMD | cj | dmd | 2013-04-01 10:23:01 | 2.10 |
| 3 | 1 | 3 | DMD | lm | dmd1 | 2013-04-01 10:23:01 | 2.20 |

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 712
| 3 | 1 | 4 | DMD | zx | dmd2 | 2013-04-01 10:23:01 | 2.30 |
| 4 | 0 | 1 | DMD | kds | dmd | 2013-04-01 10:23:01 | 1.10 |
| 4 | 0 | 2 | DMD | cj | dmd | 2013-04-01 10:23:01 | 2.10 |
| 4 | 1 | 3 | DMD | lm | dmd1 | 2013-04-01 10:23:01 | 2.20 |
| 4 | 1 | 4 | DMD | zx | dmd2 | 2013-04-01 10:23:01 | 2.30 |
| 2 | 1 | 4 | DMD | zx | dmd2 | 2013-04-01 10:23:01 | 2.30 |
+-------+------+------+------------+------+------+---------------------+------+
14 rows in set
示例2:
gbase> select * from dep;
+-------+-----------------+------------+
| depid | depname | upperdepid |
+-------+-----------------+------------+
| 0 | 总经办 | NULL |
| 1 | 开发部 | 0 |
| 2 | 测试部 | 0 |
| 3 | Server 开发部 | 1 |
| 4 | Client 开发部 | 1 |
| 5 | TA 测试部 | 2 |
| 6 | 项目测试部 | 2 |
+-------+-----------------+------------+
select depname , connect_by_root depname "root“ , connect_by_isleaf "isleaf“ ,
level ,
sys_connect_by_path(depname,'/') "path" from dep
start with upperdepid is null connect by prior depid=upperdepid
+-----------------+-----------+--------+-------+------------------
| depname | root | isleaf | level | path |
+-----------------+-----------+--------+-------+------------------
| 总经办 | 总经办 | 0 | 1 | /总经办 |
| 开发部 | 总经办 | 0 | 2 | /总经办/开发部 |
|Server 开发部 | 总经办 | 1 |3 | /总经办/开发部/Server 开发部 |
|Client 开发部 | 总经办 | 1 |3 | /总经办/开发部/Client 开发部 |
| 测试部 | 总经办 | 0 |2 | /总经办/测试部 |
| TA 测试部 | 总经办 | 1 | 3 | /总经办/测试部/TA 测试部 |
| 项目测试部 | 总经办 | 1 | 3 | /总经办/测试部/项目测试部 |
+-----------------+-----------+--------+-------+------------------


GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 713



sword GCILobFreeTemporary (
GCISvcCtx *svchp,
GCIError *errhp,
GCILobLocator *locp

);

释放临时大对象。如果在 locp 参数中传递的 LOB 定位器未指向临时 LOB,则此函数将
返回错误。

GBase 8s GCI 接口使用指南

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

参数
输入
/输出


svchp
输入/输出
上下文句柄的指针
errhp
输入/输出
错误信息句柄,该接口调用失败时,错误信息会存在该句柄上
locp
输入/输出
唯一引用要释放的 LOB 的定位器

如果执行成功,返回 GCI_SUCCESS,否则返回 GCI_ERROR。

Recover success
对集群的备份数据进行恢复,恢复集群的第二个备份周期的最新备份点:
$ python $GCLUSTER_BASE/server/bin/gcrcman.py -d /home/gbase/backup -P
gbasedba -e "recover 1"