我想知道是否可以做以下事情:
UPDATE SomeTable st
SET MyColumn1 = (SELECT SomeValue
FROM WhereverTable),
MyColumn2 = ((SELECT AnotherValue
FROM AnotherTable)
*
MyColumn1);
WHERE MyColumn4 = 'condition'
我在想,当我将AnotherValue
与MyColumn1
相乘时,它仍将具有MyColumn1
的旧值,而不是应该为SomeValue
的新值}。
如果重要的话,我正在使用DB2。
答案 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就是你想要的。但请注意,交叉连接的子查询(在本例中为wt
和at
)只需要包含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语法需要标量子查询,即WhereverTable
和AnotherTable
必须包含零行或一行。更常见的情况是,行需要使用子查询中的标识符(或条件或类似)进行“关联”,并在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
)
显然,如果有更多/可选行,事情会变得更复杂。