메인의 a 가 서브의 b 에 조건으로 주어져야 합니다.
그런데 서브에 a 가 또 있네요.
서브의 FROM 절에 a 를 제거하고 b 만 남기세요.
이 때 주의할 점은 a의 갱신 대상 건수입니다.
전체 대상으로 갱신하는게 아니라면 조건절 필수로 줘야 합니다.
조건절은 마찬가지 서브쿼리 방식으로 IN 이나 EXISTS 를 사용하면 됩니다.
UPDATE a SET (1, 2, 3) = (SELECT 1, 2, 3 -- FROM a, b FROM b -- a 제거 WHERE b.조건1 = a.조건1 -- 조건1 AND b.조건2 = a.조건2 -- 조건2 AND b.조건3 IN (400, 999) AND b.조건4 IN (220, 400) ) WHERE EXISTS (SELECT 1 FROM b WHERE b.조건1 = a.조건1 -- 조건1 AND b.조건2 = a.조건2 -- 조건2 AND b.조건3 IN (400, 999) AND b.조건4 IN (220, 400) ) ;
/*
bypass_ujvc 힌트는 11g 부터는 지원 안되는 걸로 알고 있는데, 확인을 해보셔야 할 것 같습니다.
그리고, 김동욱님이 제시하신 내용만으로는 정확한 파악이 어려워서 다음과 같은 가정을 했습니다.
1. [테이블A], [테이블B]의 구조
[테이블A] = "조건1", "조건2", "변경1", "변경2", "변경3"
[테이블B] = "조건1", "조건2", "조건3", "조건4", "변경1", "변경2", "변경3", "날짜"
2. [테이블A] : [테이블B] = 1:M 관계
3. 변경하고자 하는 [테이블A]의 "변경1", "변경2", "변경3" 칼럼은 대응하는 [테이블B]에서
"날짜" 칼럼을 사용해서 가장 최근 데이터를 반영
("날짜"가 아니더라도 [테이블A]와 [테이블B]가 1:1 관계가 될 수 있도록 적절한 기준을 반영합니다)
*/
MERGE INTO 테이블A ORG
USING (
SELECT A.*
FROM (
SELECT A.ROWID AS RID, B.변경1, B.변경2, B.변경3
, ROW_NUMBER() OVER (PARTITION BY A.ROWID ORDER BY B.날짜 DESC) AS RNK
FROM 테이블A A
INNER JOIN 테이블B B
ON B.조건1 = A.조건1 AND B.조건2 = A.조건2
AND B.조건3 IN (400,999) AND B.조건4 IN (220,400)
) A
WHERE A.RNK = 1
) TAR
ON (ORG.ROWID = TAR.RID)
WHEN MATCHED THEN
UPDATE SET ORG.변경1 = TAR.변경1, ORG.변경2 = TAR.변경2, ORG.변경3 = TAR.변경3
;