ORACLE中的CTE和表更新

时间:2016-10-31 11:18:46

标签: sql oracle common-table-expression

在我最终通过更新表中的列来存储结果之前,我想要运行许多复杂的逻辑。我收到了一个错误,并且能够将其归结为:

with my_cte as
(
  select x,ix from y
)
update z
set mycol = (select x from my_cte where z.ix = my_cte.ix)

但这会产生错误:

Error at line 4:
ORA-00928: missing SELECT keyword
set mycol = (select x from my_cte where z.ix = my_cte.ix)

这是否意味着CTE不能与更新一起使用,因为以下查询可以正常工作:

update z
set mycol = (select x from y where y.ix = my_cte.ix)

使用版本12c企业版第12.1.0.2.0版

编辑:

解决这个问题一段时间之后,获得合理性能的唯一方法是使用MERGE子句(仍然使用CTE,如下面的答案)。

merge into z using (
  with my_cte as (
    select x,ix from y
  )
)
on (
  my_cte.ix = z.ix 
)
when matched then
update set mycol = my_cte.x

2 个答案:

答案 0 :(得分:9)

在Oracle中,CTE是SELECT而不是UPDATE的一部分:

update z
    set mycol = (
          with my_cte as (
             select x, ix
             from y
          )
          select x from my_cte where z.ix = my_cte.ix
         );

答案 1 :(得分:2)

如果z.ix - 是主要的kay,y.ix - 是z.ix的外键,你可以写

update (select y.x, z.mycol
             from y, z 
           where y.ix = x.ix)
    set mycol = x;