난이도 : 중상
소요시간 : 1시간
[첫 번째 시도]
select w.id, p.age, w.coins_needed, w.power
from Wands as w
left join Wands_Property as p
on w.code = p.code
order by w.power desc, p.age desc
오류의 원인은 같은 age, 같은 power를 지니면, 그 중 값 싼 제품을 선택해야한다는 것.
이걸 대체 코드로 어떻게 나타내면 좋을까....
[두 번째 시도]
select w.id, p.age, min(w.coins_needed), w.power
from Wands as w
left join Wands_Property as p
on w.code = p.code
group by p.age, w.power
order by w.power desc, p.age desc
이 코드에서 select 에 w.id를 빼면 원하는 대로 답이 나오긴하는데, id를 포함하면 또 오류가 나고....그렇다고 id를 그룹화에 넣으면 또 원하는 답은 안나오고....
도저히 ...... 이리저리 해봐도 안되길래 도움을 받았다...ㅎ
[정답 코드]
SELECT w.id, p.age, w.coins_needed, w.power
FROM Wands AS w
LEFT JOIN Wands_Property AS p
ON w.code = p.code
WHERE w.coins_needed IN (
SELECT MIN(w1.coins_needed)
FROM Wands w1
WHERE w1.power = w.power
AND w1.code = w.code
)
AND p.is_evil = 0
ORDER BY w.power DESC, p.age DESC;
조건을 WHERE 절에 서브쿼리로 넣는 것.
이때, 나도 이렇게 진행할 때 나는 group by 로 서브쿼리를 진행했는데, 계속 정답이 안됐었음.
그 이유를 알고 보니, 조건 자체가 code 한개에 age 한개라는 조건이 있었음.
이걸 group by 로 묶게 되면, 중복인 행들이 생겨서 갯수가 정답보다 더 많이 나왔던 것.
WHERE w1.power = w.power
AND w1.code = w.code => 이걸 조건으로 중복인 행이 생기지 않도록 함
문제를... 꼭 다시읽고 또 읽고 한 번 더 보고...^^
'SQL' 카테고리의 다른 글
[프로그래머스][LV3] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 (0) | 2025.03.04 |
---|---|
[프로그래머스][LV2] 업그레이드 된 아이템 구하기 (1) | 2025.02.25 |
[Hacker Rank] SQL_Intermediate_Medium (IF/암시적조인) (0) | 2025.02.01 |
[Hacker Rank] SQL_Intermediate_Medium (ROW_NUMBER/OVER) (0) | 2025.02.01 |
[Hacker Rank] SQL_Intermediate_Medium (JOIN) (0) | 2025.01.31 |