상세 컨텐츠

본문 제목

[Oracle Join Update] 오라클 두개의 테이블 조인 업데이트

DB/Oracle

by husks 2020. 5. 7. 11:27

본문

반응형

A테이블의 컬럼에 B테이블의 컬럼을 입력 또는 할때 사용하는 쿼리 입니다.

 

예) ARTIST 테이블의 역할(ROLE_TEXT)에 ARTIST_GRP 의 역할(ROLE_CD)을 추가 해야 하는 목표

 

 

방법은 3가지 정도 있습니다.

 

1. SubQuery 를 이용한 방법

2. Updatable Join View 를 이용한 방법

3. MERGE 를 이용한 방법


1.[SubQuery 를 이용한 방법]

UPDATE
    ARTIST A
SET
    A.ROLE_TEXT = (SELECT B.ROLE_CD FROM ARTIST_GRP B WHERE A.ARTIST_ID = B.MEMBER_ID)
WHERE EXISTS (
    SELECT
        0
    FROM
        ARTIST_GRP B
    WHERE
        A.ARTIST_ID = B.MEMBER_ID
    )
;

 

 

2.[Updatable Join View 를 이용한 방법]

UPDATE /*+ bypass_ujvc */
    (SELECT
        A.ROLE_TEXT,
        B.ROLE_CD
    FROM 
        ARTIST  A,
        ARTIST_GRP B
    WHERE
        A.ARTIST_ID = B.MEMBER_ID --ARTIST 테이블의 ARTIST_ID가 반드시 PK 이어야 함 (11G 이전 버전은 bypass_ujvc 힌트로 가능)
    ) -- 2개의 테이블을 join 하여 하나의 테이블로 만든다고 생각
SET
    ROLE_TEXT = ROLE_CD --해당 테이블의 컬럼을 수정
;

 

 

3.[MERGE 를 이용한 방법]

MERGE INTO
    ARTIST A
USING
    ARTIST_GRP B
ON 
    (A.ARTIST_ID = B.MEMBER_ID)
WHEN MATCHED 
THEN
UPDATE SET A.ROLE_TEXT = B.ROLE_CD
;
반응형

추가)

위에 적은 것은 예제 이며 지금 부터 설명할 쿼리는 제가 업무에 실 사용한 쿼리 입니다. (자세한 테이블 및 컬럼명은 변경 했습니다 ^^)

 

예로 들은 위 테이블은 실제로는 1:N (ARTIST : ARTIST_GRP)  관계 입니다.

 

그래서 저는 ARTIST_GRP 을 MEMBER_ID로 GROUP BY 해주었습니다.

 

그리고 역할을 LISTAGG 함수를 사용하여 붙여 주었습니다.

 

자세한 설명은 주석을 참고 하시기 바랍니다.

UPDATE /*+bypass_ujvc*/
    (SELECT
        A.ROLE_TEXT, B.ROLE_CD --업데이트할 컬럼 정리
    FROM
        ARTIST A, 
        (SELECT --ARTIST_GRP 테이블의 멤버 아이디를 기준으로 역할을 LISTAGG 시킨다 예)작곡가;리드보컬;보컬
            MEMBER_ID,
            LISTAGG(ROLE_CD,';') WITHIN GROUP(ORDER BY MEMBER_ID) AS ROLE_CD
        FROM
            ARTIST_GRP
        WHERE
            ROLE_CD IS NOT NULL
        GROUP BY MEMBER_ID) B 
    WHERE
        A.ARTIST_ID = B.MEMBER_ID) --아티스트와 그룹 테이블의 key
SET
    ROLE_TEXT = 
        CASE 
        WHEN 
            ROLE_TEXT IS NULL THEN  ROLE_CD --ARTIST 테이블에 ROLE_TEXT가 없다면 LISTAGG 한 역할을 입력한다.
        ELSE
            ROLE_TEXT||';'||ROLE_CD --ARTIST 테이블에 ROLE_TEXT가 존재한다면 기존 ROLE_TEXT에 LISTAGG 한 역할을 붙여서 입력한다. 
        END;

 

반응형

관련글 더보기

댓글 영역