2012-11-27 49 views
0

我想:IBM DB2 9.7更新公共表表达式

  1. 选择一行,并命名为CTE
  2. 更新一些列该表CTE

我使用实现此公用表格表达,但我无法让它工作。

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规范,但仍然存在问题:)

+0

这(可能)取决于您应该包含的DB2的版本(和平台)。此外,请注意,除非您有某种函数依赖于CTE_中的排序(例如,“FETCH FIRST 1 ROW ONLY”),那么'ORDER BY'将在很大程度上被查询的其余部分忽略,并且将可能会被优化器删除。 –

回答

1

通常情况下,语法的CTE看起来更像这一点。注意那些父母。

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建议您不能在CTE中使用UPDATE语句。

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


可能的解决方法

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

update MyTable 
set ... 
where Column1 is null 
+0

关于你的回答,你的最终结论是,更新不可能CTE?如果是这样,有关此方法的任何想法? – user1340582

+0

不,我没有得出结论认为UPDATE是不可能的,因为我认为不同版本的DB2具有不同的功能集。不仅版本号不同,但我认为*大型机版本有时与中端版本和i386版本有所不同。 (我可能是错的。)但是你的发布声明不会工作,不管怎样,因为父亲。测试是否可以插入到CTE中。 (插入记录,至少在我链接的页面上。)如果你可以插入,但不能更新,那么你的答案是。 –

+0

看起来像更新是不可能的...该死的,有很多可以用T-SQL,但不是PL-SQL :) – user1340582