개요
서브쿼리를 사용하면 FROM 절에서 특정 테이블을 지정하는 것이 아닌, 서브쿼리의 결과값을 테이블로 지정할 수가 있다.
select a.id, b.name
from ( select * from tableA ORDER BY id) a
join tableB b on a.id = b.id
회사 업무 중 이 FROM절에 서브쿼리를 적용하고 내부에서 ORDER BY 통해 정렬을 하도록 쿼리를 짰는데,이 서브쿼리를 수행한 결과가 ORDER BY 지정한대로 정렬이 되지 않았다.
원인 및 해결
공식문서를 찾아보니, mysql 에서는 서브쿼리의 레코드 순서를 보장하지 않는다고 한다.
https://mariadb.com/kb/en/why-is-order-by-in-a-from-subquery-ignored/
Why is ORDER BY in a FROM Subquery Ignored?
Query with ORDER BY in a FROM subquery produces an unordered result.
mariadb.com
즉 서브쿼리에서 ORDER BY를 하면 서브쿼리 내부에서는 적용 되지만 외부에서는 ORDER BY가 풀려서 나온다.
내가 구성한 쿼리는 서브퀴리 내부에서 ORDER BY를 수행한 뒤 LIMIT으로 데이터 개수 제한을 걸어야 했기 때문에
쿼리 결과의 정렬을 위해 아래와 같이 서브쿼리 외부에 ORDER BY를 한번 더 수행했다.
select a.id, b.name
from ( select * from tableA ORDER BY id) a
join tableB b on a.id = b.id
ORDER BY a.id
'Trouble Shooting > Database' 카테고리의 다른 글
[MySQL] 슬로우 쿼리 튜닝 회고 (0) | 2023.09.20 |
---|---|
[MariaDB] Illegal mix of collations 에러 해결 (0) | 2023.08.11 |
[Oracle] ORA-12560 TNS:protocol adapter error 해결방법 (0) | 2022.11.04 |
[Mysql] Invalid use of group function 이슈 해결 (0) | 2022.09.01 |
[DB] Oracle 11g 삭제 후 재설치 시 에러 해결 (0) | 2022.07.15 |