없는 데이터 생성하는 쿼리가 가능할까요? 0 3 7,092

by 창조의날개 [SQL Query] oracle sql [2024.08.30 13:49:27]


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 입니다.

 

by 우주민 [2024.08.30 15:17:13]
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 범위를 넘어가는 데이터가 있으면 안된다는 점입니다.

(중복도 안되지만 그건 유니크하다 해주셨으니까....)


by 창조의날개 [2024.08.30 15:20:29]

우주민님 좋은 답입니다.

SELECT NVL(TA.COL1, TB.COL1) COL1
     , TB.COL2
FROM (SELECT 'C' COL1, LEVEL COL2 
      FROM DUAL 
      CONNECT BY LEVEL <= (SELECT COUNT(*) FROM TA)*2) TB
     , TA
WHERE TB.COL2 = TA.COL2(+)
ORDER BY TB.COL2
;

 


by 마농 [2024.09.02 13:48:30]

테이블 건수 * 2 가 원하는 바는 아닐 듯 합니다.
- 10건 고정 이라던가?
- 테이블 맥스값 만큼 이라던가?

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입