programing

ORACLE에서 CTE 및 테이블 업데이트

telebox 2023. 8. 10. 18:43
반응형

ORACLE에서 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)

그러나 다음과 같은 오류가 발생합니다.

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 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

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

만약 z.ix가 기본 kay이고 y.ix가 z.ix에 대한 외래 키라면, 당신은 쓸 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/40341125/cte-and-table-update-in-oracle

반응형