본문 바로가기
Programming_Language/Oracle_Sql

[Oracle] CONNECT BY LEVEL 로 FOR문처럼 사용하기

by Cocopop 2023. 6. 16.
반응형

CONNECT BY : 계층형 쿼리이지만, LEVEL로 사용해서 0~N의 값을 출력해서 FOR문 처럼 사용할 수 있다.

 

 

예제) 0~15까지 출력하기

SELECT  LEVEL-1   AS HOUR
FROM    DUAL
CONNECT BY LEVEL  <= 16

 

결과 

hour
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

 위와 같은 결과가 나옵니다.

 

 

활용!

* 프로그래머스에서 나왔던 "입양 시각 구하기(2)"문제를 CONNECT BY를 이용해서 풀어보자

SELECT  A.HOUR
    ,   NVL(B.COUNT,0) AS COUNT
FROM    (SELECT  LEVEL-1   AS HOUR
            ,   0 AS COUNT    
        FROM    DUAL
        CONNECT BY LEVEL  <= 24) A
        LEFT OUTER JOIN  (SELECT  to_number(to_char(datetime,'hh24')) AS HOUR
                        ,   COUNT(to_number(to_char(datetime,'hh24'))) AS COUNT
                    FROM    ANIMAL_OUTS
                    GROUP   BY  to_number(to_char(datetime,'hh24'))
                    ORDER   BY  HOUR ASC) B
        ON  A.HOUR = B.HOUR
ORDER   BY  A.HOUR ASC
;

-> 0~23 시간을 출력해야 하므로 CONNECT LEVEL을 이용해서 0~23을 출력했습니다.

-> 그 후 ANIMAL_OUTS 테이블에서 각 시간마다 입양 보낸 카운트 값을 구하고 조인을 시켜

대조 하면서 각 시간마다 건수를 출력합니다.

 

 

 

 결과

hour	count
0	0
1	0
2	0
3	0
4	0
5	0
6	0
7	3
8	1
9	1
10	2
11	13
12	10
13	14
14	9
15	7
16	10
17	12
18	16
19	2
20	0
21	0
22	0
23	0

위와 같은 결과가 나옵니다.

 

제가 생각한 방법은 이 쿼리지만, 좀 더 간편하게 작성 하는 분들도 있으니 참고만 해주세요 ㅎㅎ

 

 

 

 

 

 

 

 

300x250