ERROR 1064 (42000) at line 4: You have an error in your SQL syntax; [왜 HAVING earnings=MAX(earnings) 하면 안될까]
by daramiHacker Rank , Top Eaneres, 이렇게 풀면 된다.
SELECT months*salary AS earnings, COUNT(*)
FROM employee
GROUP BY earnings
HAVING earnings= (SELECT MAX(months*salary) FROM employee)
하지만 이렇게 적으면
SELECT months*salary AS earnings, COUNT(*)
FROM employee
GROUP BY earnings;
HAVING earnings=MAX(earnings)
이런 에러가 뜬다.
ERROR 1064 (42000) at line 4: You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near
'HAVING earnings=MAX(earnings)' at line 1
그리고 서브쿼리에서는 바깥 쿼리의 알리야스가 통용되지 않는다는 것을 잊으면 안된다.
근데 왜 HAVING earnings= MAX(earnings) 이렇게 쓰면 안되는걸까?
인프런 Q&A 답변에는 이렇게 적혀있다.
having절은 group by 뒤에 사용되는 절로, 서브쿼리를 사용하지 않고 바로 max(earnings)를 할 경우, earnings로 group by 가 된 상태에서 max 값을 구하게 됩니다. 따라서 전체 로우가 출력될 수 밖에 없습니다. 이런 경우를 방지하기 위해 별도의 서브쿼리를 사용하여 max값을 구해주어야 합니다.
그런데 출력해보아도 이해가 가지 않는다.
그래서 이렇게 질문을 남겼다.
안녕하세요! 같은 궁금증이 든 수강생 입니다. 왜 서브쿼리를 하지 않고 GROUP BY가 된 상태에서 MAX 값을 구하면 전체 로우가 출력될 수 밖에 없나요? 그 부분이 이해되지 않습니다.
답변이 오면 그때 다시 첨부해야겠다 :) ..라고 생각했는데 역시 많은 분들이 나와 같은 점이 이해가지 않으셨던가보다.
혹시나 하고 다음 질문글을 보니.. 같은 질문을 하신 분에게 답변이 달려있었다.
earnings로 GROUP BY 가 된 상태에서 MAX 값을 구한다는 의미는, 각 earnings의 MAX값을 구한다는 뜻입니다. 단, 여기에서 earnings 가 month * salary이고, 이 month * salary로 GROUP BY를 한 뒤에 HAVING 절에서 MAX(month * salary) 를 사용하게 되면, employee 테이블 전체에서의 MAX 값이 아닌 각각의 month * salary값의 MAX 값, 즉 month * salary 마다 그와 동일한 값이 MAX값으로 출력되는 것입니다.저희가 이 문제에서 HAVING 절을 통해 풀고 싶은 것은, employee 테이블에서 month * salary의 값이 가장 큰 값을 찾아 그 값의 수를 세는 것입니다. 따라서 employee 테이블에서 단 하나의 값을 출력하려면 서브쿼리를 통해 MAX 값이 한 개가 출력되도록 해야하는 것입니다.
말끔히 해결!
'Error가 아니라 맵이야 모음' 카테고리의 다른 글
[해결] 오라클 설치 멈춤 (인벤토리 저장 중, 70%) 상황 (0) | 2022.05.25 |
---|---|
no response on stdout my sql 해커랭크 (0) | 2022.05.19 |
TypeError: 'tuple' object is not callable (0) | 2022.04.17 |
[해결] ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). (추후 추가 예정) (0) | 2022.03.17 |
[해결] ValueError: tokens exceeds maximum length: 841 > 512 (0) | 2022.03.14 |
블로그의 정보
다람
darami