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;
[Oracle] ORDER BY NULL 정렬 (0) | 2023.03.28 |
---|---|
ORA-01489: 문자열 연결의 결과가 너무 깁니다 (0) | 2021.04.23 |
ORACLE 작은 따옴표(홑따옴표, 싱글쿼테이션) REPLACE (0) | 2019.12.31 |
ORACLE REPLACE < > 변경 (0) | 2019.11.07 |
오라클 년 리스트 (0) | 2019.06.28 |
댓글 영역