DBMS 별로, 테이블 없이 순번 레코드를 생성하는 SQL을 알아보자. SQL을 활용해 순번을 만드는 기술은, 데이터 분석을 위해 아주 유용하게 사용할 수 있는 기술이다.

ORACLE은 CONNECT BY나 XMLTABLE을 활용해 어렵지 않게 순번 레코드를 구현할 수 있다.

-- ORACLE
SELECT  ROWNUM as RNO
FROM    DUAL
CONNECT BY ROWNUM <= 10;

SELECT  ROWNUM as RNO
FROM    XMLTABLE ('1 to 10');

-- 결과
RNO
----
1
2
3
4
5
6
7
8
9
10

PostgreSQL 역시 어렵지 않다. generate_series라는 유용한 함수를 제공해준다.

-- PostgreSQL
SELECT  generate_series(1,10);

MySQL은 좀 골치가 아프다. 재귀 순환 방식의 WITH 절을 사용해야 한다. WITH 절 안에서 자기 자신을 재참조해 원하는 순번 데이터를 만들어 낼 수 있다.

-- MySQL
WITH RECURSIVE WRNO AS (
  SELECT 1 as RNO
  UNION ALL
  SELECT RNO + 1 
  FROM   WRNO
  WHERE  RNO + 1  <= 10
)
SELECT  * 
FROM    WRNO;

지금까지 살펴본 순번 생성 SQL을 응용해 문제를 풀어보자. 25년 1월 1일부터 25년 1월 31일까지의 날짜 레코드를 만들어보는 것이다. 다음과 같은 결과를 만들면 된다.

DT
-----------
2025-01-01
2025-01-02
2025-01-03
2025-01-04
2025-01-05
... 생략 ...
2025-01-27
2025-01-28
2025-01-29
2025-01-30
2025-01-31