특정 Key로 Group by 시 첫번째 데이터를 기준으로 묶이게 된다.
1 | team_A | 토끼 |
2 | team_A | 말 |
3 | team_A | 강아지 |
위와 같은 데이터로 예를 들면 ’team_A’로 Group By 할 경우 첫번째 데이터를 기준으로
1 | team_A | 토끼 |
와 같이 묶이게 된다. 이름 순으로 정렬 후 Group By를 하고 싶을 땐 적절하게 Order By 후 진행한다.
1 | team_A | 강아지 |
2 | team_A | 말 |
3 | team_A | 토끼 |
Order By를 이용해 위와 같이 데이터를 정렬 한 후 Group By 를 진행 하면 ’team_A’, ‘강아지’ 로 묶인다.
원하는 데이터를 기준으로 Order By 후 Group By를 하면 되지만 쿼리 실행 순서나 문법 상 Group By를 먼저 수행하게
되므로 아래와 같이 서브쿼리를 이용하여 먼저 정렬 후 Group By를 해줘야 한다.
SELECT *
FROM (
SELECT *
FROM JOO
ORDER BY NAME
)
GROUP BY TEAM
SELECT *
FROM JOO
ORDER BY NAME
단일 쿼리 조회 할 때와 서브쿼리 안에 넣었을때와 결과값이 달라졌다.
찾아보니 ORDER BY 가 서브쿼리 안에 존재할 경우 성능 이슈로 인해 DBMS가 자동으로 빼는듯 하다...
해결 방법
서브쿼리 안에 LIMIT 2^64-1(LIMIT의 최대값 = unsigned 64bit-1) 을 추가
SELECT *
FROM (
SELECT *
FROM JOO
ORDER BY NAME
LIMIT 18446744073709551615
) TB
GROUP BY TB.TEAM
SQL Standard에서 규정한 DB Table은 데이터의 순서가 의미를 갖는 것이 아니기 때문에 Sub Query를 실행할지라도
데이터의 본질적인 값의 구조와 정렬이 변하지 않는다고 한다.
하지만, Limit을 추가할 경우 데이터의 순서 뿐만 아니라 데이터의 갯수까지도 제한되기 때문에
테이블 내 데이터의 본절적인 내용이 변경되어 서브쿼리의 결과가 원하던 바 대로 설정되는 것이다.
'공부방 > Spring' 카테고리의 다른 글
스프링부트 (0) | 2023.04.23 |
---|---|
스프링 프레임워크의 등장 배경 (0) | 2023.04.23 |
deleteById, deleteByName (0) | 2022.09.30 |
[오류] FK가 PK가 아닌 다른 컬럼과 연관관계가 있을 때 (0) | 2022.08.31 |
[JPA] PK가 아닌 필드를 참조하는 FK를 만들 때 (0) | 2022.08.31 |