기술 블로그

with recursive 본문

데이터베이스/MySql

with recursive

parkit 2020. 6. 25. 15:53
728x90
반응형

재귀 with recursive




with recursive


1. 메모리 상에 가상의 테이블을 저장한다. 아래 0 ~ 23을 참고. 


2. 반드시 UNION 사용해야한다.


3. 반드시 비반복문도 최소한 1개 요구된다.


4. SubQuery에서 바깥의 가상의 테이블을 참조하는 문장(반복문)이 반드시 필요하다.


5. 반복되는 문장은 반드시 정지조건이 요구된다.


6. 가상의 테이블을 구성하면서 그 자신(가상의 테이블)을 참조하여 값을 결정할 때 유용한다.




1
2
3
4
5
6
7
8
with recursive rc as
(
    select 0 as n
    union
    select n+1 from rc where n < 23
)
 
select * from rc;
cs




위와 같은 구문을 실행하면, 아래와 같은 테이블이 가상으로 만들어진다.


필드명은 n이다. 


n < 23이므로, n은 22까지 실행되고 그 작업에는 n + 1 = 22 + 1 = 23까지 실행되어 23까지 출력되는 것이다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
+------+
| n    |
+------+
|    0 |
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|    6 |
|    7 |
|    8 |
|    9 |
|   10 |
|   11 |
|   12 |
|   13 |
|   14 |
|   15 |
|   16 |
|   17 |
|   18 |
|   19 |
|   20 |
|   21 |
|   22 |
|   23 |
+------+
cs





https://unrealengine.tistory.com/163






문제 설명

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.


NAME                 TYPE                 NULLABLE

ANIMAL_ID                 VARCHAR(N)   FALSE

ANIMAL_TYPE         VARCHAR(N) FALSE

DATETIME                 DATETIME         FALSE

NAME                 VARCHAR(N) TRUE

SEX_UPON_OUTCOME VARCHAR(N) FALSE


보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.


예시

SQL문을 실행하면 다음과 같이 나와야 합니다.


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




1
2
3
4
5
6
7
8
9
10
11
with recursive rc as
(
    select 0 as n
    union
    select n+1 from rc where n < 23
)
 
select a.n, count(hour(b.datetime)) hour from rc a
left join animal_outs b 
on a.n = hour(b.datetime)
group by a.n
cs


















728x90
반응형