해결된 질문
작성
·
241
·
수정됨
0
SELECT S.id,
(CASE WHEN MOD(S.id,2)=0 THEN S2.student
WHEN S.id=count(S.id) THEN S.student
ELSE s3.student END) AS student
FROM Seat AS S INNER JOIN Seat AS S2 ON S.id -1 =S2.id
INNER JOIN Seat AS S3 ON S.id +1 =S3.id;
짝수, 마지막 수, 홀수 기준으로 출력해주려고 하는데, 실제 output에서는 id 2인 친구만 출력이 되네요. 어떤 부분이 틀렸는지 궁금합니다!
+강의에서 COUNT(*)에 OVER문을 써야하는 이유도 궁금합니다. 그냥 COUNT(id)만 해도 같은 답이 되는 것 같은데 아닐까요 ㅠㅠ??
답변 1
1
group by 없이 바로 count 등의 집계함수를 사용하면 여러 개의 row가 있다 하더라도 단 하나의 row만 출력됩니다.
select id, student, count(id)
from seat
위 쿼리를 직접 돌려보시면 무슨 말인지 아실 거에요. 더 자세한 내용은 이 링크의 글을 참고해 보시면 좋을 것 같고요. 풀이 과정에서는 seat 테이블의 모든 row가 필요하기 때문에 count(id)가 아닌 count(*) over를 사용했습니다.
직접 작성하신 쿼리에서도 case 절 안의 count(S.id)
때문에 output이 한 줄만 출력되는 문제가 발생합니다. 강의 풀이처럼 여기를 count(*) over 로 바꾸는 방법이 있는데, 이렇게 해도 5줄이 아니라 3줄만 출력되고 정답 처리도 되지 않을 거에요.
왜냐하면 select 절보다 from 절의 join이 먼저 실행되기 때문입니다. join으로 서로 붙어서 만들어진 테이블로부터 select에 쓴 데이터를 가져오게 되는데, join key를 맵핑하는 과정에서 일부 row가 누락되었습니다.
s.id - 1 = s2.id -- s.id=1일 경우 1-1=0인데 s2.id=0인 데이터는 없으므로 s.id=1인 row가 누락됩니다.
s.id + 1 = s3.id -- s.id=5일 경우 5+1=6인데 s3.id=6인 데이터는 없으므로 s.id=5인 row가 누락됩니다.
만들어진 테이블이 모든 데이터를 포함하지 못하므로 이 안에서 연산을 해도 정답이 나오지 않습니다.