반응형
전에 작성한 [오라클] 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;
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)
반응형
'정보, 통신, 기술 > BI와 DB' 카테고리의 다른 글
[링크] Microstrategy MobileSuite 외 몇 가지 (0) | 2010.09.05 |
---|---|
[링크] Combine Multiple Records Comma Separated In One Column MSSQL (0) | 2010.07.11 |
[오라클] CTE를 이용한 데이터 입력 (0) | 2009.09.19 |
[Oracle] 재귀쿼리 (2) | 2008.11.18 |
MSSQL에서 멀티로우의 문자 연결하기 (0) | 2007.11.21 |