如何在 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 的单个更新语句中更新多个列的主要内容,如果未能解决你的问题,请参考以下文章

如何在单个语句中更新整个列

如何在 oracle 12c 中使用多个数据更新单个列

更新以在单个语句中切换布尔列

如何在 SQL Server 的单个批次中为列添加默认值并使用默认值更新所有行?

如何利用SQL语句查看某一个表全部列或单个列的属性?

给定一个包含多个列的手动表格,每个列都使用不同的渲染器,如何在数据更新时更改单个单元格的背景颜色?