返回首页

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

功能描述
在指定的节点上执行SQL 语句。一般情况下,SQL 语句的执行是由集群负载自动分配
到合适的节点上,execute direct 主要用于数据库维护和测试。
注意事项
当enable_nonsysadmin_execute_direct=off 时,只有系统管理员和监控管理员才能执行
EXECUTE DIRECT。
为了各个节点上数据的一致性,
SQL 语句仅支持SELECT,
不允许执行事务语句、
DDL、
DML。
使用此类型语句在指定的DN 执行stddev 聚集计算时,
返回结果集是以三元数组形式返
回,如{3, 8, 30},表示count 结果为3,sum 结果为8,平方和为30。使用此类型语句在指
定的DN 执行AVG 聚集计算时,返回结果集以二元组形式返回,如{4,2},表示sum 结果
为4,
count 结果为2。
注意,
当数据为列存时,
调用avg 函数结果未定义,
请使用stddev_samp
函数。
当指定多个节点时,
不支持agg 函数,
当query 中包含agg 函数时,
会返回
“EXECUTE
DIRECT on multinode not support agg functions.”
由于CN 节点不存储用户表数据,不允许指定CN 节点执行用户表上的SELECT 查询。
不允许执行嵌套的EXECUTE DIRECT 语句,
即执行的SQL 语句不能同样是EXECUTE
DIRECT 语句,此时可直接执行最内层EXECUTE DIRECT 语句代替。
agg 函数查询结果与直接在CN 上查询不一致,会返回多个信息,不支持array_avg 函
数。
语法格式

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1144
EXECUTE DIRECT ON ( nodename [, ... ] ) query ;
EXECUTE DIRECT ON { COORDINATORS | DATANODES | ALL } query;
参数说明

nodename
节点名称。
取值范围:已存在的节点。

query
要执行查询语句。

COORDINATORS
在所有coordinator 执行查询语句。

DATANODES
在所有datanode 执行查询语句。

ALL
在所有coordinator 和datanode 执行查询语句。
示例
--查询当前数据库实例的节点分布状态。
gbase=#SELECT * FROM pgxc_node;
node_name
| node_type | node_port |
node_host
| node_port1 |
node_host1
| hostis_primary | nodeis_primary | nodeis_preferred |
node_id
| sctp_port | control_port | sctp_port1 | control_port1
--------------+-----------+-----------+----------------+------------+--------
--------+----------------+----------------+------------------+-------------+-
----------+--------------+------------+---------------
cn_5001
| C
|
8050 | 10.180.155.74
|
8050 |

mot_allow_index_on_nullable_column
参数说明:设置是否允许在内存表nullable 列上创建索引。
该参数属于POSTMASTER 类型参数,请参考表15-1 中对应设置方法进行设置。
取值范围:布尔值
默认值:true