返回首页

gbase数据、南大通用产品文档:GBase8aSQL 语句执行后,长时间没返回的处理

更新日期:2024年09月11日

客户端应用使用接口时如遇SQL 语句过于复杂,导致服务器长时间未将结
果返回给客户端时(超时时间默认值30 秒)
,客户端会抛出超时异常。若避免
此情况的发生可在连接参数中指定connection_timeout 参数为一个较大的值。

6 GBase Python 客户端类
接口驱动基于Python Database API 2.0 标准,并实现了标准中定义的类、
属性、方法。请看如下表6-1 介绍。
表格 6-1 GBase Python 客户端类

描 述
GBaseConnection
连接类。负责接口和GBase 数据库端之间的
命令传输和数据接收。
GBaseCursor
游标类。游标类对外提供了操作GBase 数据
库主要接口。包括执行SQL 查询,获取结果
集,执行存储过程,获取存储过程结果集功
能。
GBaseError
异常类,定义了GBase 数据库和Python 标准
异常之间的映射关系。

使用 MERGE 语句,通过在单个 SQL 语句内综合 UPDATE 或 DELETE 操作
与 INSERT 操作,来将数据从源表转移到目标表内。您还可使用此语句来将源表
与目标表合并,然后对目标表仅执行 UPDATE 操作,仅执行 DELETE 操作,或
仅执行 INSERT 操作。
MERGE 语句以 GBase 8s 扩展支持 SQL 的 ANSI/ISO 标准。
语法

Update 子句


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 739
Delete 子句

Insert 子句

元素
描述
限制
语法
alias
您为 target 或
source 表对象在此
声明的临时名称
源别名与目标别名必
须不同。如果有可能
含糊,则在 alias
之前加上 AS 关键
字。
标识符
column
向其内插入源数据的
目标对象中的列
在目标对象中必须存

标识符
condition
适用于 source 与
target 表的结合中
的行的 Boolean 条

可引用 source 和
target 对象中的数
据值
条件
derived_column
如果该源对象为派生
的表,则您在此声明
其名称
SET 和 VALUES 子句
可引用此名称。
标识符
directive
查询优化器命令
命令必须有效。
优化程序
伪指令
source_table,
source_view,
source_subquery
包含要被重定位的数
据的表(或查询的结
果)
对象必须存在。另请
参阅 对 MERGE 的源
表和目标表的限制。
数据库对
象名;
SELECT 语


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 740
元素
描述
限制
语法
target_table,
target_view,
target_synonym
表的名称或同义词,
或向其中插入、更新
或删除数据的可更新
的视图
请参阅 对 MERGE 的
源表和目标表的限
制。
数据库对
象名
用法
GBase 8s 的 MERGE 语句是数据操纵语言(DML)语句,将源表对象与目标表
或视图结合。您在 ON 关键字之后指定的 condition 决定在目标上的 UPDATE
或 DELETE 操作中使用源对象的哪一行,以及在目标上的 INSERT 操作中使用
哪一行。MERGE 语句不更改源对象。
条件必须后跟 Delete 或 Update 子句的 WHEN MATCHED THEN 关键字,或后
跟 Insert 子句的 WHEN NOT MATCHED THEN 关键字,或后跟 Update(或
Delete)以及 Insert 子句。

如果您指定 Update 和 Insert 两个子句,则 MERGE 语句可在目标对象
上执行 INSERT 和 UPDATE 两个操作。

如果您指定 Delete 和 Insert 两个子句,则 MERGE 语句可在目标对象
上执行 INSERT 和 DELETE 两个操作。

如果您未指定 Insert 子句,则不执行 INSERT 操作,但 Update 子句必
须在满足该条件的源行的目标对象上指定 UPDATE 操作(抑或 Delete
子句必须指定 DELETE 操作)。

如果您未指定 Update 子句且未指定 Delete 子句,则不执行 UPDATE
或 DELETE 操作,但 Insert 子句必须为不匹配该对象的源行指定目标对
象上的 INSERT 操作。
如果未指定 Delete 子句,未指定 Update 子句,且未指定 Insert 子句,则
MERGE 语句失败并提示错误。
MERGE 语句可对目标对象产生下列影响:

如果包括 Update 子句,则 MERGE 语句根据 SET 子句的规范,以源
表中该条件取值为真的行的数据更新目标表或视图中的行。

如果包括 Delete 子句,则 MERGE 语句从目标表或视图删除该条件取
值为真的行。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 741

如果包括 Insert 子句,则 MERGE 语句根据 VALUES 子句的规范,以
源表中该条件取值为假的行数据,向目标表或视图内插入新行。
然而,单个 MERGE 语句仅可有这三个影响中的两个,因为 Delete 子句与
Update 子句是互斥的。
对于大型表上的操作,请确保在您的系统上可获得这些资源:

足够数量的锁

用于中间的结合结果的足够的临时 dbspace 存储

用于 MERGE 语句的结果的充足的 dbspace 存储。
在高可用性集群配置中,您可从主服务器或从可更新的辅助服务器发出 MERGE
语句。
优化器命令和子查询
您可在 MERGE 关键字之后,可选地指定一个或多个查询优化器命令,诸如访问
方法命令、结合顺序命令和结合方法命令来指定源表与目标表如何结合。在
MERGE 语句中,诸如 EXPLAIN 和 AVOID_EXECUTE 这样的面向目标的命令
也有效。
在 MERGE 语句内,子查询还可包括优化器命令来控制该执行计划的其他方面。
在 MERGE 语句中的下列上下文中子查询是有效的:

在 ON 子句的 condition 中

在 Update 子句的 SET 子句中

在 Insert 子句的 VALUES 子句中

在 USING 子句中如果指定源查询,可在 SELECT 语句支持子查询的地
方包括任何上下文中的子查询。
然而,如果包括引用目标表的子查询,则 MERGE 语句失败并报错。
在支持外部命令的数据库中,查询优化器还可对源与目标表的外部结合应用外部
命令,或对 MERGE 语句内的子查询。
跟在 ON 关键字之后的 condition 为源和目标表对象指定结合过滤器。 基于目
标和源表的外部结合,此 ON 子句过滤器确定 MERGE 语句中匹配的行和不匹配的
行。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 742

如果 MERGE 语句包括 Update 子句,且 ON 子句条件取值为真,则在
目标中更新相应的行。

如果 MERGE 语句包括 Delete 子句,且 ON 子句条件取值为真,则从
目标删除相应的行。

如果 MERGE 语句包括 Insert 子句,且 ON 子句条件取值为假,则将
相应的源行插入到目标内。
对与条件相匹配的行上的 MERGE 语句的 Update 操作,服从该 SET 子句的
UPDATE 语句规则。要获取在目标表中指定被更新的值的语法的详细信息,请参
阅 SET 子句。
对与条件相匹配的行上的 MERGE 语句的 Delete 操作,服从 DELETE 语句规
则。要了解从目标表删除值的详细信息,请参阅 使用 WHERE 关键字指定条
件。
对与条件不相匹配的行上的 Insert 操作服从 VALUES 子句的 INSERT 语句规
则。要了解将值插入到目标表中的语法的详细信息,请参阅 VALUES 子句。
错误处理
如果在 MERGE 语句正在执行过程中发生错误,则回滚整个语句。
对于支持事务日志记录的数据库,您可包括错误处理逻辑,包括包括定义一个或
多个保存点的 MERGE 语句的事务中的 ROLLBACK TO SAVEPOINT 语句在该
事务部分回滚到保存点之后,在目标表中保持 MERGE 语句的 INSERT、
DELETE 或 UPDATE 操作的影响,如果在该事务的保存点级的语句的文本顺序
中,该 MERGE 语句在保存点的前面的话。如果在该事务内,该 MERGE 语句
跟在指定的保存点之后,则回滚 MERGE 的影响。
在符合 ANSI 的数据库中,数据操纵语言(DML)语句通常在事务之中。这些数
据库不支持事务之外的 MERGE 语句。
约束检查
在 MERGE 操作中,强制对目标对象启用数据完整性约束。

如果检查模式设置为 DEFERRED,则直到提交该事务之后,才检查这些
约束。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 743

如果目标表的约束检查模式设置为 IMMEDIATE,则在所有 UPDATE
(或 DELETE)和 INSERT 操作完成之后,检查唯一约束和引用约束。
在 UPDATE、DELETE 和 INSERT 操作期间,检查 NOT NULL 和检
查约束。
要获取关于设置约束检查模式的信息,请参阅主题 SET Transaction Mode 语句。
如果以 ON DELETE CASCADE 关键字定义了目标表上的引用约束,则 MERGE
语句的 DELETE 子句还对目标表的孩子表的行执行级联删除。
然而,如果启用了的引用约束已在目标和源表之间建立了父子关系,则 Delete 合
并失败。MERGE 语句不可在其源表上执行级联删除。要获取更多信息,请参阅
主题 表有级联删除时对 DELETE 的限制。
如果 START VIOLATIONS 语句已在目标表上定义了活动的违反表,则 MERGE
可对目标、违反和诊断表有下列影响:

或删除或更新与结合条件相匹配的目标表中的符合的行。

目标表还收到 MERGE 成功地插入的符合的不相匹配的行。

违反表收到不符合的行。

诊断表收到关于不符合的行不能满足约束的原因的信息,以及对目标表的
MERGE 操作期间的唯一索引的信息。
要在目标表上启用违反表和诊断表,SET Database Object Mode 语句必
须设置约束或目标表的唯一索引为 ENABLED 或 FILTERING 模式。
要了解更多信息,请参阅主题 与 SET Database Object Mode 语句的关
系 和 SET Database Object Mode 语句。
使用带有触发器的 MERGE 语句
目标对象可为在其上定义 Update、Delete 或 Insert 触发器的表。如果在目标表上
Update 触发器和 Insert 触发器(或 Delete 触发器和 Insert 触发器)都启用,则
MERGE 作为两个触发器的触发事件,如果 MERGE 语句在目标上执行
UPDATE(或 DELETE)和 INSERT 操作的话。
如果 MERGE 语句包括激活 Update(或 Delete)和 Insert 触发器的操作,则当
MERGE 操作启动时,两个触发器的 BEFORE 触发器活动都执行。类似地,在

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 744
MERGE 操作的结尾,两个触发器的 AFTER 触发器活动都执行。每处理一行,
都激活 FOR EACH ROW 触发器活动。
恰如对任何 DML 语句那样,数据库服务器将同一 MERGE 语句激活的所有触发
器视同一个单个触发器,且结果触发器活动是合并的活动列表。控制一个触发器
活动的所有规则适用于作为一个列表的合并的列表,且对这两个原始触发器一视
同仁。要获取更多信息,请参阅 多个触发器的操作。
然而,目标对象不可为在其上定义启用的 INSTEAD OF 触发器的视图。在您可
使用那个视图作为 MERGE 语句的目标之前,您必须禁用或删除该 INSTEAD
OF 触发器。
在触发器的定义中,不可直接指定 MERGE 语句作为触发器活动。然而,在触发
的活动中调用的 SPL 触发器例程可发出 MERGE 语句。
安全策略和安全审计
如果源对象或其任何列被基于标签的访问控制(LBAC)安全策略所保护,则发出
该 MERGE 语句的用户必须有安全标签(或必须持有安全策略豁免),提供其足
以在 MERGE 操作中读取该源表的凭证。
如果目标对象或其任何列被基于标签的安全策略所保护,则发出 MERGE 语句的
用户必须有安全标签(或持有安全策略豁免),提供其足以在 SET 子句或
VALUES 子句指定的目标对象列中写的凭证,或足以从包括受保护的数据的目标
删除行的凭证。
如果源和目标表都受到保护,则它们必须受到同一安全策略的保护。MERGE 语
句不可结合那些受不同的 LBAC 安全策略保护的表。
在使用安全审计功能来记录活动的 GBase 8s 实例上,可能潜在地修改或显示数
据或审计配置,在对 MERGE 语句的审计跟踪中未定义特定的审计事件助记符:

Delete 子句指定的活动记录为 DELETE 事件。

Insert 子句指定的活动记录为 INSERT 事件。

Update 子句指定的活动记录为 UPDATE 事件。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 745
对 MERGE 的源表和目标表的限制
哪些表对象可为 MERGE 语句的源或目标,这取决于该表对象的属性,以及发出
MERGE 语句的对象所持有的访问权限。
对于当前会话连接到的数据库,目标表必须为本地的,但您可指定一远程表作为
源表,或在 UPDATA 操作的 SET 子句的子查询中,或在 INSERT 操作的
VALUES 子句的子查询中。
下列章节标识对源表和目标表的附加的限制。
对源表的限制
源对象可为 STANDARD、RAW、TEMP、EXTERNAL 或集合派生的表或视图的
名称或同义词。它可与目标对象在同一数据库中,或在本地 GBase 8s 实例的不
同数据库中,它或可为由不同的 GBase 8s 实例管理的远程表。
如果源是由查询的结果所定义的集合派生的表,则 USING 子句可声明派生的列
的名称,MERGE 语句的 SET 和 VALUES 子句可引用这些列。
发出 MERGE 语句的用户必须持有对源对象的数据库的 Connect 访问权限(或
更高的权限),其必须还持有对源对象的 Select 权限(或更高的权限)。可分别
地授予该用户这些访问权限,或该用户作为 PUBLIC 组的成员而持有它们,或如
果当前的或缺省的角色或 PUBLIC 持有那些权限,则可通过用户的角色持有权
限。
如果源对象或其任意列受到基于标签的安全策略保护,则发出 MERGE 语句的用
户必须有提供其读取该源对象的充足凭证的安全标签(或必须持有安全策略豁
免)。如果该用户的凭证不足以读取受保护的列,根据标准基于标签的访问控制
(LBAC)规则,则该 MERGE 语句仅可处理该源数据的一个子集。如果此子集
为空,则 MERGE 语句不可从源对象向目标表内插入任何值。
下列限制适用于源表对象:

源不可为在其上定义启用的 SELECT 触发器的视图。

源不可为与目标表在同一表层级中的类型化表

在 Delete 合并中,源不可与目标有孩子表关系,由启用的引用约束定
义,如果以 ON DELETE CASCADE 关键字定义了那个约束的话。(然
而,孩子表关系不影响 Delete 合并,除非目标表约束指定级联删除。)

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 746
对目标表的限制
目标表对象必须在当前会话连接到的同一 GBase 8s 实例的数据库中。它可为
STANDARD、RAW 或 TEMP 表,或可更新的视图的名称或同义词。如果目标
在表层级内为可更新的,则 Delete 子句还删除该目标表的所有子表中相应的行。
发出 MERGE 语句的用户必须持有对目标对象的数据库的 Connect 访问权限
(或更高的权限),且必须持有对目标对象的 Insert 权限和 Update 或 Delete 权
限,如果 MERGE 语句包括相应的 Insert、Update 或 Delete 子句的话。
下列限制适用于 MERGE 语句的目标表。如果那个表有任何下列的属性,则 MERGE
操作返回错误。

目标不可为该源表所在同一表层级中的类型化表。

目标不可为“虚拟表接口”(VTI)表。

目标不可为 CREATE EXTERNAL TABLE 语句定义的对象。

目标不可在远程 GBase 8s 实例的数据库中。

目标不可为系统目录表。

目标不可为在其上定义启用的 INSTEAD OF 触发器的视图。

目标不可为只读视图。

目标不可为伪表(在系统数据库中的常驻内存的对象,比如 sysmaster
或 sysadmin 数据库)。

目标不可为同一 MERGE 语句的任何子查询的数据源,包括 ON 子句中
的、SET 子句中的或 VALUES 子句中的子查询。

如果 MERGE 语句包括 DELETE 子句,则目标不可与源表有父表关
系,如果通过指定 ON DELETE CASCADE 关键字的启用的引用约束定
义此关系的话。
对综合的行长度的限制
MERGE 语句中的源表和目标表不可有合计综合的行长度(= 源表的行大小 + 目
标表的行大小)大于 32,767 字节。否则,MERGE 语句失败并报错,如下例所
示:
CREATE TABLE t1
(f1 INT,
f2 VARCHAR(10),
lv1 LVARCHAR(5000),

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 747
lv2 LVARCHAR(4000),
lv3 LVARCHAR(8000));
CREATE TABLE t2
(f1 INT,
f2 VARCHAR(10),
lv1 LVARCHAR(5000),
lv2 LVARCHAR(4000),
lv3 LVARCHAR(8000));

INSERT INTO t1 (f1,f2) VALUES (1,'t1 1');
INSERT INTO t1 (f1,f2) VALUES (2,'t1 2');
INSERT INTO t1 (f1,f2) VALUES (3,'t1 3');
INSERT INTO t1 (f1,f2,lv1) VALUES (7,'t1 7',
'loooooooooooooooooong');

INSERT INTO t2 (f1,f2) VALUES (3,'t2 3');
INSERT INTO t2 (f1,f2) VALUES (4,'t2 4');
INSERT INTO t2 (f1,f2) VALUES (5,'t2 5');
INSERT INTO t2 (f1,f2) VALUES (6,'t2 6');

MERGE INTO t2 AS o USING t1 AS n ON o.f1 = n.f1
WHEN NOT MATCHED THEN INSERT ( o.f1,o.f2)
VALUES ( n.f1,n.f2);
上述 MERGE 语句失败,因为源和目标表的行长度的总和超出 32,767 字节的上
限。
对于仅包括 INSERT 子句(而既没有 DELETE 子句也没有 UPDATE 子句)的
MERGE 操作,您可以通过用 INSERT INTO . . . SELECT 语句代替 MERGE 语
句来绕过此行长度限制。对于上述 MERGE 示例中相同的表和数据值,下列
INSERT 语句运行成功:
INSERT INTO t2(f1, f2)
SELECT t1.f1, t1.f2 FROM t1
WHERE NOT EXISTS
(SELECT f1, f2 FROM t2
WHERE t2.f1 = t1.f1);

INSERT INTO t2(f1,f2)

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 748
SELECT t1.f1, t1.f2 FROM t1
LEFT JOIN t2 ON t1.f1 = t2.f1
WHERE t2.f1 IS NULL;
在两个 INSERT INTO . . . SELECT 操作之后,表 t2 包含前一个 MERGE 示例
受限无法返回的行大小。
对分布式 MERGE 语句的限制
如果源表与目标表不在同一数据库中,则两个数据库都必须满足对跨数据库和跨
服务器 DML 操作的兼容性要求:

如果一个数据库符合 ANSI,则其他数据库必须也符合 ANSI。

如果一个数据库不符合 ANSI 但是用显式的事务日志记录,则其他数据
库必须也支持显式的事务日志记录。

如果一个数据库不支持事务日志记录,则其他数据库也必须不支持。

两个数据库必须有相同的 NLSCASE 敏感性设置。
例如,分布式 MERGE 语句不可在区分大小的数据库中指定源表,而在创建为
NLSCASE INSENSITIVE 的数据库中指定目标表,不论表是否包括 NCHAR 或
NVARCHAR 列。
处理重复的行
在执行 MERGE 时,目标表中的同一行不可被更新或被删除一次以上。在执行了
MERGE 语句之前,请勿尝试更新或删除尚未存在的目标中的任何行。即,没有
同一 MERGE 语句插入到目标内的行的更新或删除。
下列 MERGE 语句的示例使用事务表 new_sale 作为源表,从其来在事实表中插入
或更新行。在此样例中的结合条件测试 new_sale.cust_id 列值与 sale.cust_id
列值是否相匹配。
MERGE INTO sale USING new_sale AS n
ON sale.cust_id = n.cust_id
WHEN MATCHED THEN UPDATE
SET sale.salecount = sale.salecount + n.salecount
WHEN NOT MATCHED THEN INSERT (cust_id, salecount)
VALUES (n.cust_id, n.salecount);

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 749
要执行此 MERGE 语句,数据库服务器结合目标表和源表,并应用指定的相等条件
来处理结合的结果:

对于满足条件的行(因为 sale.cust_id 值与 new_sale.cust_id 值相匹
配),MERGE 根据 SET 子句的指定,更新 sale.salecount 列值。

对于不满足条件的行(因为在 sale 表中没有行有与 new_sale.cust_id 相
同的 cust_id 值),MERGE 根据 VALUES 子句的指定,将包含
new_sale.cust_id 和 new_sale.salecount 值的新行插入 sale 表内。
对于先前示例中的 MERGE 语句,假设 sale 目标包含两条记录,而 new_sale
源表包含三条记录。
表 1. “sale”表中的记录
cust_id
sale_count
Tom
129
Julie
230
表 2. “new_sale”表中的记录
cust_id
sale_count
Tom
20
Julie
3
Julie
10
当通过指定表达式 sale.cust_id = new_sale.cust_id 作为匹配条件将
new_sale 合并至 sale 内时,MERGE 语句返回错误,因为它尝试超过一次更新
sale 目标表中的记录之一。
分布式 MERGE 操作中的数据类型
如果源表或视图(或任何在源查询中引用的表对象)指定在 GBase 8s 实例的数
据库中的表对象, 而不是管理目标表的数据库的本地实例,则 MERGE 语句仅
可访问远程数据库中的下列数据类型的列:

非 opaque 的内建的数据类型

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 750

BOOLEAN

LVARCHAR

非 opaque 的内建的数据类型的 DISTINCT

BOOLEAN 的 DISTINCT

LVARCHAR 的 DISTINCT

出现在此列表中的任何 DISTINCT 数据类型的 DISTINCT。
跨服务器的分布式 MERGE 操作可支持这些 DISTINCT 类型,仅当将
DISTINCT 类型显式地强制转型为内建的类型,且在每一参与的数据库中以完全
相同的方式定义所有 DISTINCT 类型、其数据类型层级及其强制转型。要获取关
于 GBase 8s 在跨服务器 DML 操作中支持的数据类型的附加信息,请参阅 跨服
务器事务中的数据类型。
MERGE 不可访问另一 GBase 8s 实例的数据库,除非两个数据库实例都支持
TCP/IP 或 IPCSTR 连接,这定义在它们的 DBSERVERNAME 或
DBSERVERALIASES 配置参数中,以及在 sqlhosts 文件或 SQLHOSTS 注册子
键中。此连接类型的要求适用于 GBase 8s 实例之间的任何通信,即使两个数据
库服务器位于同一台计算机上。
然而,访问在本地 GBase 8s 实例的其他数据库中的表对象的 MERGE 操作,可访
问前述列表中任何跨服务器的数据类型以及这些附加的数据类型:

大部分内建的 opaque 数据类型,如 跨数据库事务中的数据类型 中所列

同一内建的 opaque 类型的 DISTINCT

在前面两行中的任何数据类型的 DISTINCT

显式地强制转型为内建的数据类型的 opaque 用户定义的数据类型
(UDT)。
MERGE 语句还支持通用客户端 API 中的 “分布式关系数据库架构”™
(DRDA®)协议。对于MERGE 可从远程数据库通过 DRDA 协议返回的 GBase
8s 数据类型,要查看 DRDA 所支持(以及不支持)的 GBase 8s 数据类型的列
表,请参阅 GBase 8s 管理员指南。
MERGE 语句的示例
在此部分中的示例包括在结合的结果集上展现结合条件和各种 DML 操作的
MERGE 语句。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 751
示例
下列 MERGE 语句包括 Update 和 Insert 子句,并使用相等谓词作为结合条件:
MERGE INTO customer c
USING ext_customer e
ON c.customer_num=e.customer_num
WHEN MATCHED THEN
UPDATE SET c.fname = e.fname,
c.lname = e.lname,
c.company = e.company,
c.address1 = e.address1,
c.address2 = e.address2,
c.city = e.city,
c.state = e.state,
c.zipcode = e.zipcode,
c.phone = e.phone
WHEN NOT MATCHED THEN
INSERT (c.fname, c.lname, c.company, c.address1, c.address2,
c.city, c.state, c.zipcode, c.phone)
VALUES
(e.fname, e.lname, e.company, e.address1, e.address2,
e.city, e.state, e.zipcode, e.phone);
下一示例在 ON 子句中指定多个谓词:
MERGE INTO customer c
USING ext_customer e
ON c.customer_num=e.customer_num
AND c.fname=e.fname AND c.lname=e.lname
WHEN MATCHED THEN
UPDATE SET c.fname = e.fname,
c.lname = e.lname,
c.company = e.company,
c.address1 = e.address1,
c.address2 = e.address2,
c.city = e.city,
c.state = e.state,
c.zipcode = e.zipcode,
c.phone = e.phone

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 752
WHEN NOT MATCHED THEN
INSERT
(c.fname, c.lname, c.company, c.address1, c.address2,
c.city, c.state, c.zipcode, c.phone)
VALUES
(e.fname, e.lname, e.company, e.address1, e.address2,
e.city, e.state, e.zipcode, e.phone);
下列 MERGE 语句执行 Update 结合,不带 Insert 子句:
MERGE INTO customer c
USING ext_customer e
ON c.customer_num=e.customer_num
WHEN MATCHED THEN
UPDATE SET c.fname = e.fname,
c.lname = e.lname,
c.company = e.company,
c.address1 = e.address1,
c.address2 = e.address2,
c.city = e.city,
c.state = e.state,
c.zipcode = e.zipcode,
c.phone = e.phone ;
下列 MERGE 语句仅在结合条件之后包括 Delete 子句:
MERGE INTO customer c
USING ext_customer e
ON c.customer_num=e.customer_num
WHEN MATCHED THEN
DELETE ;
下一 MERGE 示例仅包括 Insert 子句:
MERGE INTO customer c
USING ext_customer e
ON c.customer_num=e.customer_num AND c.fname=e.fname
AND c.lname=e.lname
WHEN NOT MATCHED THEN
INSERT
(c.fname, c.lname, c.company, c.address1, c.address2,
c.city, c.state, c.zipcode, c.phone)

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 753
VALUES
(e.fname, e.lname, e.company, e.address1, e.address2,
e.city, e.state, e.zipcode, e.phone);
下一示例展示 WHEN MATCHED 和 WHEN NOT MATCHED 规范可以任何顺序
出现:
MERGE INTO customer c
USING ext_customer e
ON c.customer_num=e.customer_num AND c.fname=e.fname AND
c.lname=e.lname
WHEN NOT MATCHED THEN
INSERT
(c.fname, c.lname, c.company, c.address1, c.address2,
c.city, c.state, c.zipcode, c.phone)
VALUES
(e.fname, e.lname, e.company, e.address1, e.address2,
e.city, e.state, e.zipcode, e.phone)
WHEN MATCHED THEN UPDATE
SET c.fname = e.fname,
c.lname = e.lname,
c.company = e.company,
c.address1 = e.address1,
c.address2 = e.address2,
c.city = e.city,
c.state = e.state,
c.zipcode = e.zipcode,
c.phone = e.phone ;
下列 MERGE 指定在 USING 子句中查询定义的派生的表为其源:
MERGE INTO customer c
USING (SELECT * from ext_customer e1, orders e2
WHERE e1.customer_num=e2.customer_num ) e
ON c.customer_num=e.customer_num AND c.fname=e.fname
AND c.lname=e.lname
WHEN NOT MATCHED THEN
INSERT (c.fname, c.lname, c.company, c.address1, c.address2,
c.city, c.state, c.zipcode, c.phone)
VALUES (e.fname, e.lname, e.company, e.address1, e.address2,

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 754
e.city, e.state, e.zipcode, e.phone)
WHEN MATCHED THEN
UPDATE SET c.fname = e.fname,
c.lname = e.lname,
c.company = e.company,
c.address1 = e.address1,
c.address2 = e.address2,
c.city = e.city,
c.state = e.state,
c.zipcode = e.zipcode,
c.phone = e.phone ;

(1 row)

-
描述:减
示例:
gbase=# SELECT inet '192.168.1.43' - 36 AS RESULT;
result
-------------