南大通用GBase8s 常用SQL语句(117)

DELETE 的 WHERE 子句中的子查询

DELETE 语句的 WHERE 子句中的子查询 FROM 子句可以将 DELETE 语句的 FORM 子句指定的同一个表或视图指定为数据源。仅当所有以下条件为真时,才支持带有引用相同表对象的子查询的 DELETE 操作:

  1. 该子查询要么返回一行,要么具有不相关列引用。
  2. 该子查询在 DELETE 语句的 WHERE 子句中,使用 Condition with Subquery 语法。
  3. 任何子查询中的 SPL 例程不能引用正在修改的表。

除非以上这些条件都满足,否则包含引用同 DELETE 语句修改的相同的表或视图子查询的 DELETE 语句返回错误 -360。

以下示例从 orders 表中删除其中 paid_date 列值满足 WHERE 子句中条件的行的子集。WHERE 子句通过将 IN 运算符应用于子查询返回的行来指定要删除的行,该子查询只选择 orders 表中的行,其中 paid_date 值早于当前日期:

DELETE FROM orders WHERE paid_date IN

        (SELECT paid_date FROM orders WHERE paid_date < CURRENT );

该子查询仅包含不相关的列引用,因为其唯一引用的列位于 FORM 子句中指定的表中。上面列出的要求有效,因为子查询的数据源与外部 UPDATE 语句的 FROM 子句指定的顺序表相同。上一个示例说明了 GBase 8s 支持 DELETE 语句的 WHERE 子句中不相关子查询。而不是如何写短 SQL 语句。下一示例使用更简单的语法实现了相同的结果:

DELETE orders WHERE paid_date < CURRENT;

以下示例从 stock 表中删除具有最大 unit_price 值的行(或多行)。WHERE 子句通过将等于运算符应用于子查询的结果来确定哪个 unit_price 值最大,子查询调用 unit_price 列值的内置 MAX 聚合函数:

DELETE FROM stock WHERE unit_price =

      (SELECT MAX(unit_price) FROM stock );

如果作为修改相同表的 DELETE 语句的 WHERE 子句中的子查询的数据源的表上定义了已启用的 Select 触发器,则在 DELETE 语句中执行该子查询不会激活触发器。

DELETE 语句中的子查询可以包含 UNION 或 UNION ALL 运算符。

如果外部 DELETE 语句修改表层次结构中的类型表, GBase 8s 支持在 DELETE 的 WHERE 子句中使用有效子查询的所有以下操作:

  1. 从带有( SELECT from parent table )子查询的父表中 DELETE
  2. 从带有( SELECT from child table )子查询的父表中 DELETE
  3. 从带有( SELECT from parent table )子查询的子表中 DELETE
  4. 从带有( SELECT from child table)子查询的子表中 DELETE 。

请参阅 子查询的条件主题以获取有关 DELETE 语句的 WHERE 子句中将多行返回为谓词的子查询的语法的更多信息。

为表声明别名

可以为表声明别名。别名可以引用本地或远程表、视图或同义词的完全限定数据库对象名称。

别名是未在数据库的系统目录中注册临时的名称,而且只有在 DELETE 语句运行时才会保留。

如果您声明为别名的名称是关键字 WHERE,则必须使用 AS 关键字来说明语法:

DELETE stock AS where

        WHERE manu_code =

    (SELECT manu_code FROM where WHERE manu_code MATCHES 'H*');

因为 where 是 DELETE 和 SELECT 的关键字,所以之前的示例不易读取。以下示例访问远程表而不声明表的别名:

DELETE overstock@cleveland:stock AS ocs

        WHERE manu_code =

        (SELECT manu_code FROM overstock@cleveland:stock

        WHERE manu_code MATCHES 'H*');

        ;

下一个示例在逻辑上等同于前一个 DELETE 语句,但通过将 ocs 声明为引用子查询中的相同表的别名来简化符号:

DELETE overstock@cleveland:stock AS ocs

        WHERE manu_code =

     (SELECT manu_code FROM ocs WHERE manu_code MATCHES 'H*');

使用 WHERE CURRENT OF 关键字(ESQL/C, SPL)

WHERE CURRENT OF 子句删除一个游标的活动集合的当前行。当包括这个子句时,DELETE 语句会在游标的当前位置处除去活动集合的行。在删除之后,没有任何当前的行存在;您无法使用游标删除或更新行,直到您使用 FETCH 语句(ESQL/C 例程中)或 FOREACH 语句( SPL 例程中)重新确定游标的位置。

你可以使用更新游标来访问游标的活动集合的当前行。在可以使用 WHERE CURRENT OF 子句之前,您必须通过使用 FOREACH 语句(SPL 中)或使用带 FOR UPDATE 子句( GBase 8s ESQL/C 中)的 DECLARE 语句。跟在 OF 关键字之后的 cursor_id 不能通过 SPL 例程中的 DECLARE 声明。

除非使用 FOR READ ONLY 关键字声明所有 Select 游标,否则所有 Select 游标在兼容 ANSI 的数据库中均是潜在的更新游标。您可以将 WHERE CURRENT OF 子句与没有用 FOR READ ONLY 关键字声明的任何 Select 游标一起使用。

如果您只从表层次结构中的一个表进行选择,则不可以使用 WHERE CURRENT OF 。即这个子句对 ONLY 关键字无效。

通过删除集合变量控制的集合派生的表的当前行,WHERE CURRENT OF 子句可用于从集合删除元素。有关更多信息,请参阅集合派生表。

删除包含不透明数据类型的行 

当删除一些不透明数据类型的时,它们需要特别的处理过程。例如,如果不透明数据类型包含占数据库空间的或多重表示的数据,则它可能提供如何存储该数据的选项:在内部结构中或者在智能大对象中(对于大对象)。

要完成此进程,应调用一个称为 destroy( ) 的用户定义的支持函数。当使用 DELETE 除去包含这些不透明数据类型的其中一种的行的时,数据库服务器会自动对该不透明数据类型调用 destroy( ) 。此函数决定如何除去数据,不管它存储在什么地方。有关对 destroy( ) 支持函数的更多信息,请参阅 GBase 8s 用户定义的例程和数据类型开发者指南

删除包含集合数据类型的行

当行包含集合数据类型的列(LIST 、MULTISET 或 SET),您可以在集合中搜寻特定的元素,并且删除在其中发现该元素的一行或多行。

例如,以下的示例从 new_tab 表中删除其中的 set_col 列包含元素 jimmy smith 的任何行:

DELETE FROM new_tab WHERE 'jimmy smith' IN set_col;

您也可以通过删除集合中一个或多个个别元素使用集合变量删除集合列中的值。有关更多信息,请参阅 集合派生表 和 数据库名 和 从集合中执行删除操作的示例 中的示例。

分布式 DELETE 操作中的数据类型

访问另一个 GBase 8s 实例的数据库的 DELETE 语句(或其它 SQL 数据操纵语言语句)只能引用以下数据类型:

  1. 不透明的内置数据类型
  2. BOOLEAN
  3. LVARCHAR
  4. 不透明的内置数据类型的 DISTINCT
  5. BOOLEAN DISTINCT
  6. LVARCHAR DISTINCT
  7. 出现在此列表中的任何 DISTINCT 数据类型的 DISTINCT

如果 DISTINCT 类型显式地强制转型为内置类型,并且所有的 DISTINCT 类型、它们的数据类型层次结构以及它们的强制转型在按同一方式定义在每个参与操作的数据库中,则跨服务器分布式 DELETE 操作可以支持这些 DISTINCT 类型。

跨服务器的 DML 操作不能引用复杂、大对象或者用户定义的不透明数据类型(UDT),或者不支持的 DISTINCT 类型或内置不透明类型的列或表达式。有关 GBase 8s 在跨服务器 DML 操作中支持的数据类型的其它信息,请参阅跨服务器事务中的数据类型。

但是,访问本地 GBase 8s 实例的其它数据库的分布式操作可以访问上述为跨服务器操作列出的数据类型,也能访问下列其它的数据类型大多数内置的不透明的:

  1. 大多数内置的不透明数据类型,如跨数据库事务中的数据类型 中所列
  2. 上面一行中引用的内置类型的 DISTINCT
  3. 上面两行中列出的任何数据类型的 DISTINCT
  4. 可以显式强制转型为内置数据类型的不透明的用户定义的数据类型(UDT)

如果所有的不透明和 DISTINCT UDT 都显式地强制转型成内置类型,同时所有的 UDT 、DISTINCT 类型,以及强制转型都定义在每个参与操作的数据库中,那么跨数据库的 DELETE 操作支持这些 DISTINCT 和不透明的 UDT 。

分布式 DELETE 不能访问另一个 GBase 8s 实例的数据库,除非这两个服务器在 DBSERVERNAME 或 DBSERVERALIASES 配置参数中定义了 TCP/IP 或 IPCSTR 连接。这一连接类型要求适用于 GBase 8s 实例间的所有通信,即使这两个数据库服务器都驻留在同一台计算机上。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值