【发布时间】:2014-05-04 19:58:29
【问题描述】:
我想用一条 Update 语句更新 DB2 中一个表的多个列。
任何提示或想法都会很明显。谢谢。
【问题讨论】:
标签: sql database db2 sql-update
我想用一条 Update 语句更新 DB2 中一个表的多个列。
任何提示或想法都会很明显。谢谢。
【问题讨论】:
标签: sql database db2 sql-update
所有版本 SQL 中的更新语句如下:
update table
set col1 = expr1,
col2 = expr2,
. . .
coln = exprn
where some condition
所以,答案是使用逗号分隔分配,不要重复 set 语句。
【讨论】:
update table set (col1, col2, ...) = (expr1, expr2, ...) where...
如果值来自另一个表, 你可能想使用
UPDATE table1 t1
SET (col1, col2) = (
SELECT col3, col4
FROM table2 t2
WHERE t1.col8=t2.col9
)
例子:
UPDATE table1
SET (col1, col2, col3) =(
(SELECT MIN (ship_charge), MAX (ship_charge) FROM orders),
'07/01/2007'
)
WHERE col4 = 1001;
【讨论】:
这是一个“老派解决方案”,当 MERGE 命令不起作用时(我认为在版本 10 之前)。
UPDATE TARGET_TABLE T
SET (T.VAL1, T.VAL2 ) =
(SELECT S.VAL1, S.VAL2
FROM SOURCE_TABLE S
WHERE T.KEY1 = S.KEY1 AND T.KEY2 = S.KEY2)
WHERE EXISTS
(SELECT 1
FROM SOURCE_TABLE S
WHERE T.KEY1 = S.KEY1 AND T.KEY2 = S.KEY2
AND (T.VAL1 <> S.VAL1 OR T.VAL2 <> S.VAL2));
【讨论】:
update table_name set (col1,col2,col3) values(col1,col2,col);
不是标准 SQL 且无法正常工作 你必须像 Gordon Linoff 所说的那样使用它:
update table
set col1 = expr1,
col2 = expr2,
. . .
coln = exprn
where some condition
【讨论】:
为了完整性和想要更新一行的所有列的边缘情况,您可以执行以下操作,但请考虑字段的数量和类型必须匹配。
使用数据结构
exec sql UPDATE TESTFILE
SET ROW = :DataDs
WHERE CURRENT OF CURSOR; //If using a cursor for update
来源:rpgpgm.com
仅限 SQL
UPDATE t1 SET ROW = (SELECT *
FROM t2
WHERE t2.c3 = t1.c3)
来源:ibm.com
【讨论】:
我知道这是一个老问题,但我只需要找到多行更新的解决方案,其中多个记录必须根据它们的 ID 用不同的值更新,我发现我可以使用标量子选择:
UPDATE PROJECT
SET DEPTNO =
(SELECT WORKDEPT FROM EMPLOYEE
WHERE PROJECT.RESPEMP = EMPLOYEE.EMPNO)
WHERE RESPEMP='000030'
(当然,WHERE 是可选的)
另外,我发现在此更新中指定不使用 NULL 值(如果不是第一个表中的所有记录在第二个表中都有对应的记录)是至关重要的,这样:
UPDATE PROJECT
SET DEPTNO =
(SELECT WORKDEPT FROM EMPLOYEE
WHERE PROJECT.RESPEMP = EMPLOYEE.EMPNO)
WHERE RESPEMP IN (SELECT EMPNO FROM EMPLOYEE)
来源:https://www.ibm.com/support/knowledgecenter/ssw_i5_54/sqlp/rbafyupdatesub.htm
【讨论】: