작성
·
206
0
안녕하세요! 강의 잘 듣고 있어요.
다름이 아니라 혹시 FROM절이 아닌 WHERE 절에 서브쿼리를 넣어서 문제를 풀 수 있는 방법이 있을까요?
제가 아래와 같이 WHERE절에 서브쿼리를 넣었는데, 어떤 점이 잘못 되었는지 피드백 주시면 감사드릴게요.
SELECT H.hacker_id, H.name, SUM(S.score)
FROM Hackers H
INNER JOIN Submissions S
ON H.hacker_id = S.hacker_id
WHERE S.score = (
SELECT H.hacker_id, S.challenge_id, MAX(S.score)
FROM Submissions
GROUP BY hacker_id, challenge_id
) AS A
GROUP BY H.hacker_id, H.name
HAVING SUM(S.score) > 0
ORDER BY SUM(S.score), H.hacker_id;
답변 1
0
WHERE 절에서 에러가 나는 것은 두 항 중 첫번째 것은 1개의 값(s.score)이고, 두 번째 것은 3개의 값(h.hacker_id, s.challenge_id, max(s.score))이라서 서로 비교가 불가능하기 때문입니다.
서브쿼리의 SELECT 절에 s.score 컬럼과 비교할 단 하나의 컬럼만 명시를 하셔야 합니다.
그럼 max(s.score)만 남겨야 하겠다는 생각을 하실 수도 있을 것 같은데요.
이 경우에는 동일한 hacker_id의 점수끼리 비교하도록 붙이는 과정이 빠지게 됩니다.
서브쿼리는 서브쿼리 밖에서 일어나는 INNER JOIN 등과 관계 없이 단독으로 작동하기 때문입니다.
이 문제에서는 WHERE 절보다는 FROM 절에 서브쿼리를 사용하는 것이 훨씬 명확한 풀이인 듯 합니다.