정보, 통신, 기술/BI와 DB

[오라클] CTE를 이용한 데이터 수정

최윤호 2009. 10. 27. 16:42
반응형

전에 작성한 [오라클] CTE를 이용한 데이터 입력 2탄, CTE를 이용한 데이터 수정입니다.

CREATE TABLE MYT (ID INT, NAME VARCHAR(100), INDATE DATE);

INSERT INTO MYT VALUES (1, '김', SYSDATE);
INSERT INTO MYT VALUES (2, '이', SYSDATE);
INSERT INTO MYT VALUES (3, '박', SYSDATE);

SELECT * FROM MYT;

UPDATE MYT A
   SET NAME = NVL((WITH TAB AS (SELECT 1 ID, '최' NAME FROM DUAL
                                 UNION
                                SELECT 2 ID, '황' NAME FROM DUAL)
                   SELECT NAME
                     FROM TAB B
                    WHERE A.ID = B.ID)
                  , A.NAME)
    , INDATE = SYSDATE
;

DROP TABLE MYT;

약간의 문제가 있습니다.

1) MYT의 일부 행만을 수정하려면 아래쪽 WHERE에 새로운 CTE를 다시 작성해야 합니다.
위 쿼리문도 INDATE가 전부다 수정이 됩니다. "3-박"이 수정되지 않은 이유는 NVL을 적절하게 활용하고 있기 때문이죠.
SET 우변의 CTE는 WHERE 구문에 사용할 수가 없네요.

2) 컬럼들을 ()로 묶어서 한 서브쿼리로 여러 컬럼을 한번에 수정하는 쿼리는 안 됩니다.
아래와 같은 경우 말이죠. 사실 이건 되는 오라클이 대단한거죠!!

UPDATE TABLE SET (C1, C2) = (SELECT C1, C2 FROM TABLE2)

반응형