如何在 DB2 的单个更新语句中更新多个列
Posted
技术标签:
【中文标题】如何在 DB2 的单个更新语句中更新多个列【英文标题】:How to update multiple columns in single update statement in DB2 【发布时间】:2014-05-04 19:58:29 【问题描述】:我想用一条 Update 语句更新 DB2 中一个表的多个列。
任何提示或想法都会很明显。谢谢。
【问题讨论】:
【参考方案1】:所有版本 SQL 中的更新语句如下:
update table
set col1 = expr1,
col2 = expr2,
. . .
coln = exprn
where some condition
所以,答案是使用逗号分隔分配,不要重复 set
语句。
【讨论】:
DB2 也支持行赋值:update table set (col1, col2, ...) = (expr1, expr2, ...) where...
@mustaccio 我尝试了您的版本以及 Gordon 提到的上述版本,但它们没有用。然后我在这里问问题。在我的查询中不同的是......更新(根据某些条件选择表的特定记录) set col1 = val1, col2 = val2; update (根据某些条件选择表的特定记录) set (col1, col2) = (val1, val2);
@超人。 . .问另一个问题,这次提供有关您实际尝试做的事情的详细信息。仅仅编辑这个问题对任何回答过原始版本的人(即我)都是不公平的。
@超人。 . .这只是一个一般原则,即当问题发生重大变化时,它会影响已经尝试通过答案或 cmets 解决问题的人。最好删除问题并重新开始。 (而且我不需要这个问题的要点。)【参考方案2】:
如果值来自另一个表, 你可能想使用
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;
【讨论】:
【参考方案3】:这是一个“老派解决方案”,当 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));
【讨论】:
【参考方案4】: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
【讨论】:
【参考方案5】:为了完整性和想要更新一行的所有列的边缘情况,您可以执行以下操作,但请考虑字段的数量和类型必须匹配。
使用数据结构
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
【讨论】:
【参考方案6】:我知道这是一个老问题,但我只需要找到多行更新的解决方案,其中多个记录必须根据它们的 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
【讨论】:
以上是关于如何在 DB2 的单个更新语句中更新多个列的主要内容,如果未能解决你的问题,请参考以下文章