특정 테이블의 UPDATE문을 실행할 때 다른 테이블과 조건을 걸어 값을 바꿔야 하는 경우가 있습니다.
MySQL에서는 아래와 같이 UPDATE문에 JOIN을 걸어 사용이 가능합니다.
UPDATE STUDENT A
INNER JOIN SCHOOL B
ON A.SCHOOL_NO = B.SCHOOL_NO
SET A.CONTACT_NUMBER = B.SCHOOL_NUMBER
WHERE A.SCHOOL_NO = 1
AND A.CONTACT_NUMBER IS NULL;
쿼리는 학생의 연락처가 비어 있는 경우, 같은 학교 번호를 가진 SCHOOL 테이블에서 학교 전화번호를 학생의 연락처로 업데이트하는 작업을 수행합니다.
Oracle에서는 UPDATE .. JOIN 구문을 제공하지 않기 때문에 위 쿼리를 Oracle에서 작성하게 된다면 다음과 같이 할 수 있습니다.
1. 서브쿼리 사용
UPDATE STUDENT A
SET A.CONTACT_NUMBER = (
SELECT B.SCHOOL_NUMBER
FROM SCHOOL B
WHERE A.SCHOOL_NO = B.SCHOOL_NO
)
WHERE A.SCHOOL_NO = 1
AND A.CONTACT_NUMBER IS NULL;
서브쿼리를 사용하여 SCHOOL 테이블에서 SCHOOL_NO가 동일한 레코드의 SCHOOL_NUMBER 값을 가져옵니다. 이 값이 A.CONTACT_NUMBER에 설정됩니다.
2. Merge문 사용
MERGE INTO STUDENT A
USING SCHOOL B
ON (A.SCHOOL_NO = B.SCHOOL_NO
AND A.SCHOOL_NO = 1
AND A.CONTACT_NUMBER IS NULL)
WHEN MATCHED THEN
UPDATE SET A.CONTACT_NUMBER = B.SCHOOL_NUMBER;
ON 절을 통해 SCHOOL_NO가 같은 경우에 두 테이블의 레코드를 일치시키도록 합니다. 그리고 WHEN MATCHED THEN 을 통해 조건을 만족하는 레코드가 있을 때 업데이트를 수행합니다.
+ 피드백은 언제나 환영입니다 :)