지난 프로젝트의 쿼리문에서 자주 등장하며 나를 애먹였던 CONNECT BY LEVEL
구문이 있었다.
다른 개발자분이 작성해놓으신 쿼리문에 포함되어 있었는데,
처음봤을때 너무 어렵게 느껴져서 해석하는데만 해도 시간이 꽤 걸렸던 기억이난다😂
그당시에는 구글링으로 어렵사리 이해하며 겨우 고비를 넘겼지만, 지금은 철수하고 시간이 있으니 제대로 이해하고 잊어버리지 않기 위해 정리를 해보려고 한다.
LEVEL을 사용하면 FOR문처럼 활용이 가능하다고 한다.
SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL <= 10;
-- +ROWNUM 만 하면 12월2일 ~ 1월1일이 출력되므로, +(ROWNUM -1)을 하면 정상출력 된다.
-- +1을 하지 않으면 1일 ~ 30일까지만 출력이 되므로, +1을 하면 31일까지 출력된다.
SELECT TO_DATE('20231201','YYYYMMDD') + (ROWNUM -1) AS TEMP_CAL
FROM DUAL
CONNECT BY LEVEL <= (TO_DATE('20231231','YYYYMMDD') - TO_DATE('20231201','YYYYMMDD') + 1)
SELECT TO_TIMESTAMP('01' + (ROWNUM -1) || ':00','HH24:MI') AS TEMP_TIME
FROM DUAL
CONNECT BY LEVEL <= 23;
SELECT 0 + (ROWNUM -1) AS HOUR
FROM DUAL
CONNECT BY LEVEL <= 24
-- 결과는 0 부터 23까지 출력됨
-- 입양 시각 구하기
SELECT A.HOUR
, COUNT(B.HOUR) AS COUNT
FROM (
-- 0부터 23까지 출력
SELECT 0 + (ROWNUM -1) AS HOUR
FROM DUAL
CONNECT BY LEVEL <= 24
) A
LEFT OUTER JOIN
(
SELECT EXTRACT(HOUR FROM CAST(DATETIME AS TIMESTAMP)) AS HOUR
FROM ANIMAL_OUTS
) B
ON A.HOUR = B.HOUR
GROUP BY A.HOUR
ORDER BY HOUR