返回首页

gbase数据、南大通用产品文档:GBase8a使用freenode 和全新节点替换纯data 节点功能对比

更新日期:2024年09月11日

两种功能对比介绍
表 4-13 使用freenode 替换纯data 节点和全新节点替换纯data 节点对比
对比内容
相同点
不同点
使用freenode 替换纯data 节点
流程基本相同
使用freenode 替换后,
freenode 节点替代
被替换的data 节点。
使用全新节点替换替换纯data
节点功能
使用全新节点替换完成后,节点ip 不改
变,分布规则也不变。

GBase UP 产品手册 4 管理员指南

文档版本04(2021-04-21) 南大通用数据技术股份有限公司 143

功能说明
CTE(common table expression)可定义多个, 按书写顺序,支持后面的CTE 的
query_definition 中引用前面定义的CTE。
Expression_name 可以与数据库中的基础
表或者视图名称相同,主查询引用expression_name 标识符的地方,都是指CTE,
而不是数据库中的基础表或者视图,若没有书写库名将优先引用定义的CTE,若
书写了库名.表名,如test.t1 将引用基础表或视图。
语法格式
[
WITH
Expression_name AS
(
CTE_query_definition
)
, …
]
SELECT ……(主查询);

CTE_query_definition 为一条select 语句,仅支持select 查询语句,其它语句
不支持,其语法需符合GCluster 的select 查询的语法。其它语法约束与from
子查询一致(如定义语句不能为select … into outfile,不能为select …
into …server 等)。From 子查询中支持的语法,CTE 定义语句也同样支持。

Expression_name 为给出的CTE 名称,必须是一个符合GCluster 命名规范的
标识符,CTE 名称长度限定为64 个字符,由数字、字母和下划线组成,若
包含特殊字符需用反引号括起来。若定义了多个CTE,每个CTE 的名称必
须唯一。
示例
gbase> set _t_gcluster_support_cte=1;
示例1:定义一个CTE
gbase> with tt as (select * from t) select * from tt;
+------+------+
| a
| b
|
+------+------+

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1103
|
1 | aa
|
+------+------+
1 row in set (Elapsed: 00:00:00.76)
示例2:定义多个CTE
gbase> with tt1 as (select a,b from t),tt2 as (select a,b from t) select * from tt1
join tt2 on tt1.a=tt2.a;
+------+------+------+------+
| a
| b
| a
| b
|
+------+------+------+------+
|
1 | aa
|
1 | aa
|
+------+------+------+------+
1 row in set (Elapsed: 00:00:04.23)
示例3:后面的CTE 引用前面的CTE
gbase> with tt1 as(select a,b from t),tt2 as(select a+10 as ab from tt1) select *
from tt2;
+------+
| ab
|
+------+
|
11 |
+------+
1 row in set (Elapsed: 00:00:00.54)
示例4:一次定义,多次使用
gbase> with tt as(select a,b from t) select * from tt tt1 join tt tt2 on tt1.a=tt2.a;
+------+------+------+------+
| a
| b
| a
| b
|
+------+------+------+------+
|
1 | aa
|
1 | aa
|
+------+------+------+------+
1 row in set (Elapsed: 00:00:02.86)
示例5:union 场景,只支持“全局”的CTE
gbase> with tt as(select a,b from t) select * from tt where a>1 union select *
from tt where a<1;
+------+------+
| a
| b
|
+------+------+
|
2 | bbb
|
|
-1 | ccc
|
+------+------+
4
rows in set (Elapsed: 00:00:01.01)
示例6:insert…select 中select 部分使用CTE
gbase> insert into t(a,b) with tt as (select a,b from t) select a,b from tt;
Query OK, 3 rows affected (Elapsed: 00:00:01.29)
Records: 3
Duplicates: 0
Warnings: 0
示例7:create…select 中的select 部分使用CTE

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1104
gbase> create table abc as with tt as(select a,b from t) select a,b from tt;
Query OK, 6 rows affected (Elapsed: 00:00:05.91)
示例8:子查询中定义CTE
gbase> with base as (select * from t) select * from (with t1 as (select * from
base) select * from t1) t where a in (select a from t);
+------+------+
| a
| b
|
+------+------+
|
1 | aa
|
|
2 | bbb
|
|
-1 | ccc
|
|
1 | aa
|
|
2 | bbb
|
|
-1 | ccc
|
+------+------+
6 rows in set (Elapsed: 00:00:02.70)

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1105
注意

增加参数_t_gcluster_support_cte 控制gcluster 是否支持cte 语法。
该参数为session 级参数,
默认值为0 表示不支持,
值设置为1 时支持CTE
语法。

子查询中with as 声明的alias 为全局的,不支持子查询中标识符的范围控
制,子查询中的with as 可在全局范围内顺序引用且共用同一名称空间。
按定义顺序,后面的with as 定义可以引用前面的with as 定义。
with tt as (select * from t1) select * from (with tt as (select * from t1) select *
from tt limit 10) aa;
ERROR 1066 (42000): Not unique table/alias: 'tt'

CTE 定义的select 语句中支持使用grouped hint。如
gccli -c -q
use vc vc2023;
use testdb;
set _t_gcluster_support_cte=1;
with tt as(select /*+ grouped('1') */ a,b from t1) select * from tt join t2 on
tt.a=t2.a;

不支持存储过程、函数、视图定义中使用包含有CTE 的查询语句。

不支持嵌套定义CTE。如:
with abcd as (with tt as (select 1 from t1) select * from tt) select * from abcd;
ERROR 1149 (42000): You have an error in your SQL syntax; check the
manual that corresponds to your GBase server version for the right syntax to
use

当设置了如下参数后,CTE 中含有开窗函数时,会通过解析,但是执行结
果不正确
_t_gcluster_support_cte=1
_t_gbase_new_window_function_support=1

可以在查询的 Projection 子句或 WHERE 子句中使用时间函数 DAY 、MONTH 、
WEEKDAY 和 YEAR 。这些函数返回与用来调用函数的表达式或参数对应的值。还可以使
用 CURRENT 或 SYSDATE 函数返回具有当前日期和时间的值,
或者使用 EXTEND 函数调
整 DATE 或 DATETIME 值。

DAY 和 CURRENT 函数
下列查询在两个 expression 列中对 call_dtime 和 res_dtime 列返回日期(一个月中的某一
天)。
图: 查询
SELECT customer_num, DAY (call_dtime), DAY (res_dtime)
FROM cust_calls;
图: 查询结果
customer_num (expression) (expression)

106 12 12
110 7 7
119 1 2
121 10 10
127 31
116 28 28
116 21 27
下列查询使用 DAY 和 CURRENT 函数来将列值与当前日期(月中某日)进行比较。它只
选择值比当前日期早的那些行。在此示例中,CURRENT 日是 15。
图: 查询
SELECT customer_num, DAY (call_dtime), DAY (res_dtime)
FROM cust_calls
WHERE DAY (call_dtime) < DAY (CURRENT);
图: 查询结果
customer_num (expression) (expression)
106 12 12
110 7 7

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 88 -

119 1 2
121 10 10
下列查询使用 CURRENT 函数来选择除今天打的电话之外的所有来电。
图: 查询
SELECT customer_num, call_code, call_descr
FROM cust_calls
WHERE call_dtime < CURRENT YEAR TO DAY;
图: 查询结果
customer_num 106
call_code D
call_descr Order was received, but two of the cans of ANZ tennis
balls
within the case were empty

customer_num 110
call_code L
call_descr Order placed one month ago (6/7) not received.

customer_num 116
call_code I
call_descr Second complaint from this customer! Received two cases
right-handed outfielder gloves (1 HRO) instead of one case
lefties.
SYSDATE 函数与 CURRENT 函数及其类似,但当未指定 DATETIME 限定符时,其返回
值的缺省精度是 DATETIME YEAR TO FRACTION(5),而不是 CURRENT 的缺省精度
DATETIME YEAR TO FRACTION(3)。

MONTH 函数
下列查询使用 MONTH 函数来抽取和显示在哪个月份接收和处理客户来电,并且它将对结
果列使用显式标签。但是,它不区分年份。
图: 查询
SELECT customer_num,
MONTH (call_dtime) call_month,
MONTH (res_dtime) res_month
FROM cust_calls;

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 89 -

图: 查询结果
customer_num call_month res_month

106 6 6
110 7 7
119 7 7
121 7 7
127 7
116 11 11
116 12 12
如果 DAY 比当前日期早,
那么下列查询使用 MONTH 函数和 DAY 及 CURRENT 来显示在
哪个月份接收和处理客户来电。
图: 查询
SELECT customer_num,
MONTH (call_dtime) called,
MONTH (res_dtime) resolved
FROM cust_calls
WHERE DAY (res_dtime) < DAY (CURRENT);
图: 查询结果
customer_num called resolved

106 6 6
119 7 7
121 7 7

WEEKDAY 函数
下列查询使用 WEEKDAY 函数来指示在星期几接收并处理来电(0 表示星期日,1 表示星
期一,以此类推),并标记表达式列。
图: 查询
SELECT customer_num,
WEEKDAY (call_dtime) called,
WEEKDAY (res_dtime) resolved
FROM cust_calls
ORDER BY resolved;
图: 查询结果

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 90 -

customer_num called resolved

127 3
110 0 0
119 1 2
121 3 3
116 3 3
106 3 3
116 5 4
下列查询使用 COUNT 和 WEEKDAY 函数来对在周末收到的来电进行计数。
此类语句能够
使您了解客户来电模式或指示是否需要加班费。
图: 查询
SELECT COUNT(*)
FROM cust_calls
WHERE WEEKDAY (call_dtime) IN (0,6);
图: 查询结果
(count(*))

4

YEAR 函数
下列查询检索 call_dtime 比当前年份的开始早的行。
图: 程序
SELECT customer_num, call_code,
YEAR (call_dtime) call_year,
YEAR (res_dtime) res_year
FROM cust_calls
WHERE YEAR (call_dtime) < YEAR (TODAY);
图: 查询结果
customer_num call_code call_year res_year

116 I 1997 1997
116 I 1997 1997


GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 91 -

格式化 DATETIME 值
在下列查询中,EXTEND 函数仅显示指定的子字段以限制两个 DATETIME 值。
图: 程序
SELECT customer_num,
EXTEND (call_dtime, month to minute) call_time,
EXTEND (res_dtime, month to minute) res_time
FROM cust_calls
ORDER BY res_time;
该查询为标签为 call_time 和 res_time 的列返回月份至分钟范围,提供工作量的指示。
图: 查询结果
customer_num call_time res_time

127 07-31 14:30
106 06-12 08:20 06-12 08:25
119 07-01 15:00 07-02 08:21
110 07-07 10:24 07-07 10:30
121 07-10 14:05 07-10 14:06
116 11-28 13:34 11-28 16:47
116 12-21 11:24 12-27 08:19
TO_CHAR 函数也可以格式化 DATETIME 值。有关内置函数的信息,请参阅 TO_CHAR
函数,该函数也可接受作为参数的 DATE 值或数字值并返回格式化的字符串。
除了这些示例说明的内置时间函数之外,GBase 8s 还支持 ADD_MONTHS 、LAST_DAY 、
MDY 、MONTHS_BETWEEN 、NEXT_DAY 和QUARTER 函数。除了这些函数,
TRUNC 和 ROUND 函数也可返回更改 DATE 或 DATETIME 参数精度的值。
这些附加时
间函数在 GBase 8s SQL 指南:语法中进行了描述。