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

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

最佳答案

在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
         );

关于sql - Oracle中的CTE和表更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40341125/

10-11 03:00