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

使用子查询来更新多列值

该表达式列表可包括一个或多个子查询。每一必须返回包含一个或多个值的单个行。SET 子句显式地或隐式地指定的列的数目必须等于在多列 SET 子句中等号(=)之后的表达式(或表达式列表)所返回的值的数目。

必须将子查询括在圆括号之间。这些圆括号嵌套在紧跟在等号(=)之后的圆括号之内。如果表达式列表包括多个子查询,则必须将每一子查询括在圆括号之间,以逗号(,)分隔连续的子查询:

UPDATE ... SET ... = ((subqueryA),(subqueryB), ... (subqueryN))

下列示例展示 SET 子句中子查询的使用:

UPDATE items

    SET (stock_num, manu_code, quantity) =

    ( (SELECT stock_num, manu_code FROM stock

    WHERE description = 'baseball'), 2)

    WHERE item_num = 1 AND order_num = 1001;

          

UPDATE table1

  SET (col1, col2, col3) =

   ((SELECT MIN (ship_charge), MAX (ship_charge) FROM orders), '07/01/2007')

   WHERE col4 = 1001;

如果您正在更新表层级中的超级表,则 SET 子句不可包括引用它的子表之一的子查询。如果您正在更新表层级中的子表,则 SET 子句中的子查询可引用超级表,如果它仅引用超级表的话。也就是说,子查询必须使用 SELECT… FROM ONLY (supertable) 语法。

更新 ROW 类型列

使用 SET 子句来更新命名的或未命名的 ROW 类型列。例如,假设您定义下列命名的 ROW 类型和包含命名的和未命名的 ROW 类型的列的表:

CREATE ROW TYPE address_t

          (

          street CHAR(20), city CHAR(15), state CHAR(2)

          );

          CREATE TABLE empinfo

          (

          emp_id INT

          name ROW ( fname CHAR(20), lname CHAR(20)),

          address address_t

          );

要更新未命名的 ROW 类型,请在圆括号括起的字段值的列表之前指定 ROW 构造函数。

下列语句更新 empinfo 表的 name 列(未命名的 ROW 类型):

UPDATE empinfo SET name = ROW('John','Williams') WHERE emp_id =455;

要更新命名的 ROW 类型,请在字段值的列表(在圆括号中)之前指定 ROW 构造函数,并使用强制转型(::)运算符来将 ROW 值强制转型为命名的 ROW 类型。下列语句更新 empinfo 表的 address 列(命名的 ROW 类型):

UPDATE empinfo

          SET address = ROW('103 Baker St','Tracy','CA')::address_t

          WHERE emp_id = 3568;

要获取更多关于 ROW 构造函数的语法,请参阅 构造函数表达式。另请参阅 Literal Row。

ROW 列 SET 子句仅可支持字段的文字值。要使用 ESQL/C 变量来指定字段值,您必须将 ROW 数据选择到 row 变量内,使用单独的字段值的主变量,然后以 row 变量更新 ROW 列。要获取更多信息,请参阅 更新 Row 变量(ESQL/C)。

您可使用 GBase 8s ESQL/C 主变量来插入非文字值作为:

  1. 整个 row 类型插入列内

使用 row 变量作为 SET 子句中的变量名称来一次更新 ROW 列中的所有字段。

  1. ROW 类型的单独字段

要将非文字值插入 ROW 类型列内,您可首先更新 row 变量中的元素,然后指定在 UPDATE 语句的 SET 子句中的 collection 变量。

当您使用 SET 子句中的 row 变量时,row 变量必须包含每一字段值的值。要获取关于如何将值插入到 row 变量内的信息,请参阅 更新 Row 变量(ESQL/C)。

您可使用 UPDATE 语句来只修改行中的某些字段:

  1. 以字段 projection 指定其值保持不变的所有字段的字段名称

例如,下列 UPDATE 语句仅更改 empinfo 表的 address 列的 street  city 字段:

UPDATE empinfo

SET address = ROW('23 Elm St', 'Sacramento', address.state)

WHERE emp_id = 433;

address.state 字段保持不变。

  1. 将该行选择到 ESQL/C row 变量内并更新期望的字段。

要获取更多信息,请参阅 更新 Row 变量(ESQL/C)。

更新集合列

您可使用 SET 子句来更新集合列中的值。要获取更多信息,请参阅 集合构造函数。

集合变量可更新集合类型列。以集合变量,您可插入一个或多个集合的单独元素。要获取更多信息,请参阅 集合派生表。

例如,假设您定义 tab1 表如下:

CREATE TABLE tab1

        (

        int1 INTEGER,

        list1 LIST(ROW(a INTEGER, b CHAR(5)) NOT NULL),

        dec1 DECIMAL(5,2)

        );

下列 UPDATE 语句更新 tab1 中的一行:

UPDATE tab1

      SET list1 = LIST{ROW(2, 'zyxwv'),

      ROW(POW(2,6), '=64'),

      ROW(ROUND(ROOT(146)), '=12')},

      WHERE int1 = 10;

在此示例中的集合列 list1 有三个元素。每一元素是带有 INTEGER 字段和 CHAR(5) 字段的未命名的 ROW 类型。第一个元素包括两个文字值:一个整数(2 )和一个引号括起的字符串('zyxwv')。

第二个和第三个元素还使引用字符串来表明第二个字段的值。然而,它们以表达式,而不是以文字值,来指定第一个字段的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值