2016-10-31 9 views
4

テーブルの列を更新して最終的に結果を保存する前に、実行したいと思う複雑なロジックがたくさんあります。私はエラーを取得していますし、それを降りすることができました:ORACLEのCTEとテーブルの更新

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

これは単にのCTEは、次のクエリの作品以来の更新で使用することはできませんどういう意味:

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

しかし、これはエラーになります罰金:

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

使用バージョン12cのEnterprise Editionのリリース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 
+0

CTEは次のように更新サブクエリとして引き続き使用できます。https://stackoverflow.com/a/39534514/603516 – Vadzim

答えて

6

、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

z.ixがいる場合 - プライマリ・ケイとy.ixがされて - あなたをz.ixへの外部キーであります書き込み可能

関連する問題