나도 직접 당해보기 전까지는 쉬운 문제 아닌가 하고 생각했다.
짤처럼 정말 시시해서 죽고싶어졌다 같은 쉬운 문제로 생각했다.
근데 실제로 해보니 쉽지 않았다.
예를 들어 이런 테이블에서 seq가 최대값을 가진 row를 구한다고 생각해보자.
id | seq | name |
---|---|---|
1 | 1 | low |
1 | 2 | middle |
1 | 3 | high |
2 | 10 | small |
2 | 20 | medium |
2 | 30 | large |
어떻게 구할 것인가?
SELECT id, MAX(seq) AS seq, name
FROM exTable
GROUP BY id
이렇게 하면 될 것 같은데 안된다.
결과는 이렇게 나온다.
id | seq | name |
---|---|---|
1 | 3 | low |
2 | 30 | small |
그럼 저걸 다시 괄호로 감싸서 밖에서 최대값을 구하려고 해본다거나
ORDER BY
로 정렬해서 빼본다거나
별의 별 생각을 다 해봤지만 해낼 수 없었다.
아니, 쉬운 문제일 줄 알았는데...
그래서 시시해서 죽었냐
도와줘요 구글
결국 쉽지 않다고 인정하고 검색을 시작했다.
그리고 아래 방법으로 해결했다.
SELECT original.*
FROM exTable original
LEFT JOIN exTable compare
ON original.id = compare.id
AND original.seq < compare.seq
WHERE compare.id IS NULL;
WHERE
문 보다 ON - AND
문이 먼저 발동되므로
LEFT JOIN
에 의해 seq
필드가 낮은 row에만 compare값이 들어간다는 점을 이용하여
최대값을 가진 row만을 추출해낼 수 있다.
FROM
과 LEFT JOIN
안에 들어가는 table이 그냥 table이면 좋겠지만,
괄호로 묶고 서브쿼리가 복잡하게 들어가야 하면
FROM
에 한번, LEFT JOIN
에 한번
총 두번 같은 서브쿼리를 써야한다는 문제점이 있다.
그 만큼 쿼리가 길어질 가능성이 존재한다.
더 아름다운 방법이 있는데 내가 모르고 있는 것 뿐이라면 좋겠다.
더 짧고 간결하고 아름다운 방법은 없는걸까 ㅠㅠ
SELECT *
FROM exTable
WHERE seq = (Select max(seq) From exTable)