반응형
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
반응형
'programing' 카테고리의 다른 글
Spring Boot 앱에서 예외를 처리하려고 할 때 로그에 ErrorPageFilter 오류가 발생했습니다. (0) | 2023.08.10 |
---|---|
Oracle JDBC 드라이버에서 타임스탬프 열에 Java 날짜를 쓸 때 시간대는 어떻게 됩니까? (0) | 2023.08.10 |
MutableLiveData에서 setValue()와 postValue()의 차이 (0) | 2023.08.10 |
파이썬으로 문자열이 숫자로 시작하는지 확인하는 방법은 무엇입니까? (0) | 2023.08.10 |
C의 char to int 변환 (0) | 2023.08.10 |