WITH TA(COL1, COL2) AS ( SELECT 'B', 2 FROM DUAL UNION ALL SELECT 'A', 3 FROM DUAL UNION ALL SELECT 'A', 5 FROM DUAL UNION ALL SELECT 'A', 7 FROM DUAL UNION ALL SELECT 'B', 9 FROM DUAL ) SELECT * FROM TA ;
위와 같이 TA 테이블이 있습니다.
데이터 건수가 5개 이므로 5개의 데이터를 더 추가하여 총 10개의 로우로 아래처럼 만들고 싶습니다.
COL1 | COL2 |
C | 1 |
B | 2 |
A | 3 |
C | 4 |
A | 5 |
C | 6 |
A | 7 |
C | 8 |
B | 9 |
C | 10 |
COL1값이 A, B인 경우의 COL2값은 그대로 유지하면서
COL1값에 C를 가지는 TA 테이블 데이터 5개만큼 1부터 빠진 자연수를 채워줘야 합니다.
(그러므로 총 5개의 로우를 생성해주어야 합니다)
COL2는 중복이 발생하지 않아야 하므로 기존 TA테이블에 COL2 값이 중복으로 들어가는 경우는 없습니다.
오라클 쿼리로 가능할까요? 버젼은 19C 입니다.
WITH TA(COL1, COL2) AS ( SELECT 'B', 2 FROM DUAL UNION ALL SELECT 'A', 3 FROM DUAL UNION ALL SELECT 'A', 5 FROM DUAL UNION ALL SELECT 'A', 7 FROM DUAL UNION ALL SELECT 'B', 9 FROM DUAL ) , ADD_NUM AS ( SELECT 1 AS NUM FROM DUAL UNION ALL SELECT 2 FROM DUAL UNION ALL SELECT 3 FROM DUAL UNION ALL SELECT 4 FROM DUAL UNION ALL SELECT 5 FROM DUAL UNION ALL SELECT 6 FROM DUAL UNION ALL SELECT 7 FROM DUAL UNION ALL SELECT 8 FROM DUAL UNION ALL SELECT 9 FROM DUAL UNION ALL SELECT 10 FROM DUAL ) SELECT NVL(T.COL1,'C') AS COL1, N.NUM FROM TA T RIGHT OUTER JOIN ADD_NUM N ON T.COL2 = N.NUM ORDER BY N.NUM ;
단순하게 1~10 의 데이터를 가진 테이블을 만들고 OUTER JOIN 후에 매칭이 안되는 COL1 값을 NVL을 이용해 'C' 값을 채워 넣었습니다.
이 방법의 단점은 기존 테이블의 데이터값이 1~10 범위를 넘어가는 데이터가 있으면 안된다는 점입니다.
(중복도 안되지만 그건 유니크하다 해주셨으니까....)