반응형
전에 작성한 [오라클] 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' 카테고리의 다른 글
DMV를 이용해 SSAS 조회하기 (0) | 2011.04.07 |
---|---|
오라클 스키마 조회 퀴리 (0) | 2011.03.28 |
MSSQL 테이블, 뷰 스키마 정보 조회 (0) | 2010.09.16 |
[오라클] CTE를 이용한 데이터 입력 (0) | 2009.09.19 |
[SQL Tip] DB 정규화 (0) | 2007.02.26 |