- WITH 절을 이용하여 가상 테이블 만들어 주기

 

WITH 테이블명 AS

(

          SELECT 쿼리

          UNION ALL

          SELECT 쿼리

)

 

=> WITH절로 만들어진 데이터베이스는 저장되는 테이블이 아닌 임시테이블이다.

     생성 이후 쿼리문에서 계속 사용 가능하다.

 

문제

 

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

 

나의 정답

SELECT B.n , IFNULL(A.COUNT,0) AS COUNT
	FROM (
		SELECT  
			HOUR(DATETIME) AS HOUR,
			COUNT(DATETIME) AS COUNT
		FROM ANIMAL_OUTS
		GROUP BY HOUR
	) A
	RIGHT JOIN(
    	WITH RECURSIVE cte AS (
          SELECT 0 AS n
          UNION ALL
          SELECT n + 1 FROM cte WHERE n < 23
		)
		SELECT n FROM cte
	) B ON A.HOUR = B.n ;

 

먼저 이 문제 DB에서는 7시부터 19시 까지의 시간대별 데이터만 있어서 이외의 시간의 데이터를 별도로 생성해줘야했다.

그렇기 때문에 WITH 절을 사용하여 해당 시간대까지의 칼럼을 생성해주었다. 그 후 기존의 있는 테이블과 RIGHT JOIN을 하여 해당 시간대 별의 입양 건수를 조회하였다. RIGHT JOIN을 하는 이유는 생성한 CTE 테이블의 값은 모두 유지되어야 하기때문에 RIGHT JOIN을 하였다.

+ Recent posts