본문 바로가기

Algorithm/TIP

[SQL] WITH(RECURSIVE) 가상의 테이블

728x90

 

WITH

메모리상에 가상의 테이블을 저장할 때 사용된다 (1회만사용가능)

WITH TMP AS 
(
	SELECT A,B,C
    FROM T
    WHERE... 
)


SELECT ...
FROM TMP #여기서 사용가능
WHERE ...

 

 

WITH RECURSVIE 

recursive 말 그대로, 자기 자신의 값을 참조하여 값을 가지는 테이블이다

WITH RECURSIVE TMP AS(
    SELECT 0 AS NUM # 초기값 0
    UNION ALL
    SELECT NUM+1 FROM TMP # 초기값 0을 이용하여 테이블 생성
    WEHRE NUM < 10 # 반복 정도 
)

RECURSIVE 사용시에는 UNION ALL이 필수적이며,

WHERE를 이용하여 정지 조건을 설정한다 

 

 

이를 이용한 문제

프로그래머스 SQL 고득점 Kit GROUP BY : 입양시각 구하기(2) 

-- 코드를 입력하세요
WITH RECURSIVE T AS (
    SELECT 0 AS HOUR
    UNION ALL
    SELECT HOUR+1 AS HOUR
    FROM T
    WHERE HOUR<23
)

SELECT T.HOUR, COUNT(HOUR(DATETIME))
FROM ANIMAL_OUTS RIGHT OUTER JOIN T 
ON HOUR(DATETIME) = HOUR
GROUP BY HOUR
ORDER BY HOUR

포인트는

COUNT가 0인 것도 시간은 보여줘야 하므로

HOUR칸은 T에서 골라야하고

존재하지 않는 행도 COUNT하면 1이 되므로, 이를 방지하기 위해 ANIMAL_OUT에 존재하는 DATETIME만 COUNT에 반영해주는 것

728x90

'Algorithm > TIP' 카테고리의 다른 글

[c++] string내 substring 있는지 찾아내기 (find)  (0) 2023.01.03
형변환  (0) 2023.01.03
SQL 고득점 Kit [JOIN 시리즈]  (1) 2022.10.28
TIP) 'b' - 'a' = 1  (0) 2022.10.22
[c++] compare 함수 (sort / priority queue)  (0) 2022.10.21