带有更新的IBM DB2 9.7公用表表达式

时间:2012-11-27 11:01:09

标签: sql db2 common-table-expression

我想:

  1. 选择一行并将其命名为CTE
  2. 更新该表CTE的一些列
  3. 我使用公共表表达式来实现它,但我无法使其工作。

    Begin
    With CTE AS
    (select * from MyTable where Column1 is null order by Column2 desc
    (Update CTE
    Set Column3= 1, Column4 = 1, Column5 = 1))
    Commit;
    

    我试图遵循DB2规范,但仍然遇到问题:)

2 个答案:

答案 0 :(得分:1)

通常,CTE的语法看起来更像这样。注意parens。

With CTE AS
(
  select * from MyTable where Column1 is null order by Column2 desc
)
Update CTE
Set Column3= 1, Column4 = 1, Column5 = 1;

但是this documentation建议您不能将UPDATE语句与CTE一起使用。

  

您可以在任何地方定义公用表表达式   全选声明。例如,您可以包含公用表   SELECT,INSERT,SELECT INTO或CREATE VIEW语句中的表达式。


可能的解决方法

如果CTE不可更新,只需删除CTE,然后编写UPDATE语句。你根本不需要ORDER BY。这看起来像是一个等效的UPDATE语句。

update MyTable
set ...
where Column1 is null

答案 1 :(得分:0)

怎么样

UPDATE (
  SELECT * FROM MYTABLE WHERE COLUMN1 IS NULL ORDER BY COLUMN2 DESC
  FETCH FIRST 1 ROW ONLY
)
SET COLUMN3= 1, COLUMN4 = 1, COLUMN5 = 1;

或者,如果您想获得更大的灵活性,也许我对此How to Update Multiple Queries in optimized way in DB2的回答