SQL/DataBase

[SQL] 59042 없어진 기록 찾기


프로그래머스 [SQL] 없어진 기록 찾기

❌ 오답

SELECT o.animal_id, o.name
FROM animal_ins i RIGHT OUTER JOIN animal_outs o ON i.animal_id = o.animal_id
WHERE o.animal_id is not null AND i.animal_id is null;
ORDER BY o.animal_id;

✅ o.animal_id IS NOT NULL ← 불필요한 조건

✅ RIGHT OUTER JOIN 사용 ← 동일 결과지만 덜 직관적

정답 코드

SELECT o.animal_id, o.name
FROM animal_outs o LEFT OUTER JOIN animal_ins i ON o.animal_id = i.animal_id
WHERE i.animal_id is null
ORDER BY o.animal_id;



🚗 [SQL] 151138 자동차 대여 기록에서 장기/단기 대여 구분하기


프로그래머스 [SQL] 자동차 대여 기록에서 장기/단기 대여 구분하기

1. 문제


2. 실패한 시도

❌ 오답

SELECT j.car_id, j.car_type, j.daily_fee * ((100 - j.discount_rate)*0.01) * 30 AS fee
FROM (car_rental_company_car c INNER JOIN car_rental_company_discount_plan d ON c.car_type = d.car_type) AS j
     INNER JOIN car_rental_company_rental_history h ON j.car_id = h.car_id
WHERE car_type = '세단' OR 'SUV' AND h.end_date < '2024-11-01'
ORDER BY fee DESC, j.car_type, j.car_id DESC

 SQL WHERE 절에서 논리 오류 주의

✅ 날짜 조건을 부정확하게 작성함

✅ GROUP BY는 중복 방지용이 아니다.

✅ ROUND 함수로 실수처리한다.


3. 정답 코드

SELECT j.car_id, j.car_type, ROUND(j.daily_fee * ((100 - j.discount_rate)*0.01) * 30) AS fee
FROM (
    SELECT c.car_id, c.car_type, c.daily_fee, d.discount_rate
    FROM car_rental_company_car c
    INNER JOIN car_rental_company_discount_plan d
    ON c.car_type = d.car_type AND d.duration_type = '30일 이상') AS j
WHERE car_type IN ('세단', 'SUV')
AND NOT EXISTS (
    SELECT 1
    FROM car_rental_company_rental_history h2
    WHERE h2.car_id = j.car_id
    AND NOT (h2.end_date < '2022-11-01' OR h2.start_date > '2022-11-30')
)
ORDER BY fee DESC, j.car_type, j.car_id DESC;

📌 TMI: