728x90
✅ 2번 JOIN 하는 대신 서브쿼리로 날짜조건으로 거른 다음 DISTICT사용함 (그래서 GROUPBY CAR_ID 사용 안함-중복행 문제)
서브쿼리 이점: 중간 결과 집합 최소화
JOIN을 사용하면 중간 결과로 큰 테이블이 생성될 수 있지만, 서브쿼리는 필요한 데이터만 필터링하여 반환합니다.이는 메모리 사용을 줄이고 전체적인 쿼리 실행 속도를 향상시킬 수 있습니다.
✅ DISTICT써서 HAVING절에 GROUPBY쓰지 않아도 됨 (일부 SQL허용 -MySQL)
✅ 11월 한 달 동안 대여 가능한 차량 조건 구하기
"11월 한 달 동안 대여 가능한 차량"입니다. 이를 논리적으로 표현하면 "11월 동안 대여되지 않은 차량"이 됩니다.
(END_DATE < '2022-11-01') OR (START_DATE > '2022-11-30')
이제 드모르간 법칙을 사용하면
NOT (A OR B) = (NOT A) AND (NOT B)
NOT ((END_DATE < '2022-11-01') OR (START_DATE > '2022-11-30'))
= (NOT (END_DATE < '2022-11-01')) AND (NOT (START_DATE > '2022-11-30'))
= (END_DATE >= '2022-11-01') AND (START_DATE <= '2022-11-30')
✅ 코드
-- 코드를 입력하세요
SELECT DISTINCT C.CAR_ID, C.CAR_TYPE, ROUND(30*C.DAILY_FEE*(100-P.DISCOUNT_RATE)/100) AS FEE
FROM CAR_RENTAL_COMPANY_CAR AS C
JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS P ON C.CAR_TYPE = P.CAR_TYPE
WHERE C.CAR_ID NOT IN (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE END_DATE >= '2022-11-01' AND START_DATE <= '2022-11-30'
)
AND C.CAR_TYPE IN ('세단','SUV')
AND P.DURATION_TYPE = '30일 이상'
HAVING 500000 <= FEE AND FEE < 2000000
ORDER BY FEE DESC, C.CAR_TYPE, C.CAR_ID DESC
728x90
'코딩테스트 > SQL' 카테고리의 다른 글
[JOIN] 없어진 기록 찾기 (☆) (0) | 2024.09.11 |
---|---|
[JOIN] 그룹별 조건에 맞는 식당 목록 출력하기 (☆☆) (0) | 2024.09.11 |
[JOIN] 조건에 맞는 도서와 저자 리스트 출력하기 (☆☆) (2) | 2024.09.10 |
[JOIN] 주문량이 많은 아이스크림들 조회하기 (☆☆) (0) | 2024.09.10 |
[JOIN] 5월 식품들의 총매출 조회하기 (☆) (0) | 2024.09.10 |