WITH RECURSIVE TIMETABLE(HOUR) AS (
SELECT 0
UNION
SELECT TIMETABLE.HOUR + 1
FROM TIMETABLE
WHERE TIMETABLE.HOUR < 23
)
SELECT HOUR, COUNT(A.ANIMAL_ID)
FROM TIMETABLE AS T LEFT JOIN ANIMAL_OUTS AS A ON T.HOUR = HOUR(A.DATETIME)
GROUP BY HOUR
ORDER BY HOUR
WITH
SQL에서 WITH 절은 공통 테이블 표현식(CTE, Common Table Expression)을 정의하는 데 사용된다. CTE는 복잡한 쿼리를 더 간결하게 만들고, 가독성을 높이며, 재사용할 수 있는 쿼리 블록을 생성하는 데 유용하다.
WITH CTE_NAME AS (
-- CTE 정의를 위한 쿼리
SELECT column1, column2
FROM table_name
WHERE condition
)
SELECT *
FROM CTE_NAME
WHERE another_condition;
직원 테이블에서 평균 급여보다 높은 급여를 받는 직원 목록을 가져오는 예제:
WITH AverageSalary AS (
SELECT AVG(salary) AS avg_salary
FROM employees
)
SELECT name, salary
FROM employees
WHERE salary > (SELECT avg_salary FROM AverageSalary);
CTE는 특히 복잡한 쿼리를 구성하고 싶은 경우 매우 유용한 도구다.
RECURSIVE
SQL에서 재귀 쿼리는 주로 계층적 데이터 구조를 처리할 때 사용된다. 대표적으로 CTE(Common Table Expression)를 사용하여 재귀 쿼리를 작성할 수 있다.
CTE는 WITH 절을 사용하여 정의하며, 재귀 쿼리는 두 부분으로 나눌 수 있다: 기본 쿼리와 재귀 쿼리다.
employees라는 테이블이 있고, 이 테이블에는 직원의 ID, 이름, 그리고 상사의 ID가 포함되어 있다고 가정한다.
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100),
manager_id INT
);
이제 다음과 같은 데이터를 삽입했다고 가정
INSERT INTO employees (id, name, manager_id) VALUES
(1, '최고경영자', NULL),
(2, '부사장', 1),
(3, '이사', 2),
(4, '팀장', 3),
(5, '직원', 4);
이제 특정 직원(예: ID가 5인 직원)의 상사를 모두 찾는 재귀 쿼리를 작성할 수 있다.
WITH RECURSIVE EmployeeHierarchy AS (
-- 기본 쿼리: 시작점
SELECT id, name, manager_id
FROM employees
WHERE id = 5 -- 시작 직원의 ID
UNION ALL
-- 재귀 쿼리: 상사를 찾는 부분
SELECT e.id, e.name, e.manager_id
FROM employees e
INNER JOIN EmployeeHierarchy eh ON e.id = eh.manager_id
)
SELECT * FROM EmployeeHierarchy;
이 쿼리는 ID가 5인 직원의 상사들을 찾아서 출력한다. 기본 쿼리에서 시작 직원(직원 ID 5)을 선택하고, 재귀적으로 그 직원의 상사를 찾는 방식으로 동작한다.
이와 같은 방식으로 다양한 계층적 데이터를 처리할 수 있다.