使用子查询来更新多列值
该表达式列表可包括一个或多个子查询。每一必须返回包含一个或多个值的单个行。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 主变量来插入非文字值作为:
- 整个 row 类型插入列内
使用 row 变量作为 SET 子句中的变量名称来一次更新 ROW 列中的所有字段。
- ROW 类型的单独字段
要将非文字值插入 ROW 类型列内,您可首先更新 row 变量中的元素,然后指定在 UPDATE 语句的 SET 子句中的 collection 变量。
当您使用 SET 子句中的 row 变量时,row 变量必须包含每一字段值的值。要获取关于如何将值插入到 row 变量内的信息,请参阅 更新 Row 变量(ESQL/C)。
您可使用 UPDATE 语句来只修改行中的某些字段:
- 以字段 projection 指定其值保持不变的所有字段的字段名称
例如,下列 UPDATE 语句仅更改 empinfo 表的 address 列的 street 和 city 字段:
UPDATE empinfo
SET address = ROW('23 Elm St', 'Sacramento', address.state)
WHERE emp_id = 433;
address.state 字段保持不变。
- 将该行选择到 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')。
第二个和第三个元素还使引用字符串来表明第二个字段的值。然而,它们以表达式,而不是以文字值,来指定第一个字段的值。