- 选择一行,并命名为CTE
- 更新一些列该表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规范,但仍然存在问题:)
我使用实现此公用表格表达,但我无法让它工作。
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规范,但仍然存在问题:)
通常情况下,语法的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
关于你的回答,你的最终结论是,更新不可能CTE?如果是这样,有关此方法的任何想法? – user1340582
不,我没有得出结论认为UPDATE是不可能的,因为我认为不同版本的DB2具有不同的功能集。不仅版本号不同,但我认为*大型机版本有时与中端版本和i386版本有所不同。 (我可能是错的。)但是你的发布声明不会工作,不管怎样,因为父亲。测试是否可以插入到CTE中。 (插入记录,至少在我链接的页面上。)如果你可以插入,但不能更新,那么你的答案是。 –
看起来像更新是不可能的...该死的,有很多可以用T-SQL,但不是PL-SQL :) – user1340582
这(可能)取决于您应该包含的DB2的版本(和平台)。此外,请注意,除非您有某种函数依赖于CTE_中的排序(例如,“FETCH FIRST 1 ROW ONLY”),那么'ORDER BY'将在很大程度上被查询的其余部分忽略,并且将可能会被优化器删除。 –