💡문제 설명
# CTE (COMMON TABLE EXPRESSIONS) 임시 테이블
WITH SUB AS (
SELECT
C.DAILY_FEE,
C.CAR_TYPE,
H.HISTORY_ID,
DATEDIFF(H.END_DATE, H.START_DATE) + 1 AS DURATION,
CASE WHEN DATEDIFF(H.END_DATE, H.START_DATE) + 1 >= 90 THEN '90일 이상'
WHEN DATEDIFF(H.END_DATE, H.START_DATE) + 1 >= 30 THEN '30일 이상'
WHEN DATEDIFF(H.END_DATE, H.START_DATE) + 1 >= 7 THEN '7일 이상'
ELSE 'NONE' END AS DURATION_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY AS H
JOIN CAR_RENTAL_COMPANY_CAR AS C
ON C.CAR_ID = H.CAR_ID
WHERE C.CAR_TYPE = '트럭')
SELECT
SUB.HISTORY_ID,
ROUND(SUB.DAILY_FEE * (100 - IFNULL(P.DISCOUNT_RATE, 0)) / 100) * SUB.DURATION AS FEE
FROM SUB
LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS P
ON SUB.CAR_TYPE = P.CAR_TYPE
AND SUB.DURATION_TYPE = P.DURATION_TYPE -- 두 개의 JOIN KEY 가 필요
ORDER BY FEE DESC, HISTORY_ID DESC
CTE (Coommon Table Expressions) - 가상 임시 테이블
CTE란 무엇인가? CTE(Common Table Expression)는 복잡한 SQL 쿼리를 보다 단순하고 재사용 가능한 형태로 만들기 위해 사용되는 임시의 결과 집합을 정의하는 SQL 구문입니다. CTE는 쿼리 실행 시 한 번만 생성되며, 그 쿼리 내에서만 유효합니다. SQL의 WITH 구문을 사용하여 정의합니다.
CTE의 장점:
- 가독성과 유지보수성 향상: CTE는 쿼리를 더 명확하고 이해하기 쉽게 분할할 수 있게 해줍니다.
- 재사용성: 한 쿼리 내에서 여러 번 CTE를 참조할 수 있습니다.
- 재귀적 쿼리 실행 가능: 재귀 CTE를 사용하여 계층적이거나 재귀적인 데이터를 쉽게 쿼리할 수 있습니다.
WITH CTE_Name AS (
SELECT column1, column2, ...
FROM table
WHERE condition
)
SELECT column1, column2, ...
FROM CTE_Name
WHERE condition;
재귀적 CTE (Recursive CTE)
재귀적 CTE란 무엇인가? 재귀적 CTE는 자기 자신을 참조하여 반복적으로 쿼리를 수행하는 CTE입니다. 이를 통해, 계층적 데이터를 탐색하거나, 복잡한 계산을 수행하거나, 순차적 데이터를 생성할 때 유용하게 사용됩니다.
재귀적 CTE의 구성: 재귀적 CTE는 두 부분으로 나뉩니다.
- 기본 케이스(Base Case): 재귀의 시작점을 정의하며, 보통 간단한 SELECT 문입니다.
- 재귀적 단계(Recursive Step): 자기 자신을 참조하는 SELECT 문으로, 이전 단계의 결과를 사용하여 다음 데이터를 생성합니다.
WITH RECURSIVE CTE_Name AS (
-- 기본 케이스
SELECT column1, column2, ...
FROM table
WHERE condition
UNION ALL
-- 재귀적 단계
SELECT column1, column2, ...
FROM table
JOIN CTE_Name ON condition
WHERE condition
)
SELECT * FROM CTE_Name;
주의점:
- 재귀 CTE는 적절한 종료 조건이 필요합니다. 그렇지 않으면 무한 루프에 빠질 수 있습니다.
- UNION ALL은 기본 케이스와 재귀적 단계를 연결할 때 사용합니다. UNION을 사용하면 중복된 결과가 제거되어 재귀가 제대로 동작하지 않을 수 있습니다.
반응형
'Programming > SQL' 카테고리의 다른 글
비교 연산자 (3) | 2024.09.25 |
---|---|
[leetcode | SELECT, EXISTS] Rising Temperature (0) | 2024.08.14 |
[프로그래머스 SQL] 오프라인/온라인 판매 데이터 통합하기 (2) | 2024.07.23 |
[프로그래머스 SQL 고득점 kit] 그룹별 조건에 맞는 식당 목록 출력하기 (4) | 2024.07.22 |
[프로그래머스 SQL] 조건에 맞는 사용자 정보 조회하기 (0) | 2024.07.08 |