【问题标题】:How to update multiple columns in single update statement in DB2如何在 DB2 的单个更新语句中更新多个列
【发布时间】:2014-05-04 19:58:29
【问题描述】:

我想用一条 Update 语句更新 DB2 中一个表的多个列。

任何提示或想法都会很明显。谢谢。

【问题讨论】:

    标签: sql database db2 sql-update


    【解决方案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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-09-22
              • 1970-01-01
              • 2012-05-13
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多