更新另一列的列

时间:2011-05-05 21:17:32

标签: sql db2

我想知道是否可以做以下事情:

UPDATE SomeTable st
    SET MyColumn1 = (SELECT SomeValue
                     FROM WhereverTable),

        MyColumn2 = ((SELECT AnotherValue
                     FROM AnotherTable)
                     *
                     MyColumn1);
WHERE MyColumn4 = 'condition'

我在想,当我将AnotherValueMyColumn1相乘时,它仍将具有MyColumn1的旧值,而不是应该为SomeValue的新值}。

如果重要的话,我正在使用DB2。

4 个答案:

答案 0 :(得分:1)

使用MyColumn1的原始值来计算乘法表达式,而不是更新中指定的值。如果要在乘法公式中使用MyColumn1的新值,则也在那里指定新表达式。此外,您应该在子查询中放置MIN,MAX或FETCH FIRST ROW,以防止返回多行。

答案 1 :(得分:0)

如果没有更多细节,很难给你一个坚实的答案。但我会捅一下:

    UPDATE SomeTable
       SET MyColumn1 = wt.SomeValue
           MyColumn2 = at.AnotherValue
      FROM SomeTable st
CROSS JOIN (
               SELECT SomeValue FROM WhereverTable
           ) wt
CROSS JOIN (
               SELECT AnotherValue FROM AnotherTable
           ) at
WHERE MyColumn4 = 'condition'

如果他们真的没有关系,那么CROSS JOIN就是你想要的。但请注意,交叉连接的子查询(在本例中为wtat)只需要包含1条记录,否则JOIN将导致在其中生成多条记录。 FROM子句。不知道它会对这个查询做什么,但它可能会使结果集不可更新。

请注意,我使用的是SQL Server的T-SQL语法,因为这是我更熟悉的。但是一个快速谷歌发现DB2确实支持交叉连接(参见here)。

答案 2 :(得分:0)

试试这个(未经测试):

UPDATE SomeTable 
    SET MyColumn1 = (SELECT SomeValue
                     FROM WhereverTable),

        MyColumn2 = MyColumn1 * (SELECT AnotherValue
                                 FROM AnotherTable)
WHERE MyColumn4 = 'condition';

此标准SQL-92语法需要标量子查询,即WhereverTableAnotherTable必须包含零行或一行。更常见的情况是,行需要使用子查询中的标识符(或条件或类似)进行“关联”,并在SET子句和WHERE子句中UPDATE子句进行“关联”。 1}}声明例如(SQL-92,未经测试):

UPDATE SomeTable
   SET MyColumn1 = (
                    SELECT wt.SomeValue
                      FROM WhereverTable AS wt
                     WHERE wt.some_table_ID = SomeTable.some_table_ID
                   ),
       MyColumn2 = MyColumn1 * (
                                SELECT av.AnotherValue
                                  FROM AnotherTable AS av
                                 WHERE wt.another_table_ID = SomeTable.another_table_ID
                               )
 WHERE MyColumn4 = 'condition'
       AND EXISTS (
                   SELECT *
                     FROM WhereverTable AS wt
                    WHERE wt.some_table_ID = SomeTable.some_table_ID
                  )
        OR EXISTS (
                   SELECT *
                     FROM AnotherTable AS av
                    WHERE wt.another_table_ID = SomeTable.another_table_ID
                  ); 

这可以使用SQL-99的MERGE语句重写,给出较少的'重复'代码。

答案 3 :(得分:0)

假设表总是返回一行(并且一行),以下内容应该可以正常工作:

UPDATE SomeTable st SET (MyColumn1, MyColumn2) = (SELECT SomeValue, 
                                                         AnotherValue * MyColumn1
                                                  FROM WhereverTable wt
                                                  CROSS JOIN AnotherTable at)
WHERE MyColumn4 = 'condition'

这将根据需要更新MyColumn2(使用旧值MyColumn1) 显然,如果有更多/可选行,事情会变得更复杂。