
나도 직접 당해보기 전까지는 쉬운 문제 아닌가 하고 생각했다.
짤처럼 정말 시시해서 죽고싶어졌다 같은 쉬운 문제로 생각했다.
근데 실제로 해보니 쉽지 않았다.
예를 들어 이런 테이블에서 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)