ORACLE에서는 SELECT 내에 쓰인 비집계 컬럼을 모두 GROUP BY에 포함시켜야만 에러가 발생하지 않는다.
때문에 SELECT에 뽑고 싶은 데이터를 모두 포함시키면서 동시에 특정 컬럼별로 집계할 때 GROUP BY에 불필요한 컬럼을 함께 넣어주어야 하고 이 문제로 인해 잘 못 집계되는 경우도 발생할 수 있다.
이 상황이 은근 많이 마주하게 되어,
비집계 컬럼을 모두 뽑아내면서, 원하는 대로 집계하기 위해 쓰기 좋은 패턴 3가지를 정리해본다.
윈도우 함수 사용
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES FROM ( SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES, ROW_NUMBER() OVER (PARTITION BY FOOD_TYPE ORDER BY FAVORITES DESC) AS RN FROM REST_INFO ) WHERE RN = 1 ORDER BY FOOD_TYPE DESC;
서브쿼리 + INNER JOIN 사용
SELECT R.FOOD_TYPE, R.REST_ID, R.REST_NAME, R.FAVORITES FROM REST_INFO R INNER JOIN ( SELECT FOOD_TYPE, MAX(FAVORITES) AS MAX_FAVORITES FROM REST_INFO GROUP BY FOOD_TYPE ) M ON R.FOOD_TYPE = M.FOOD_TYPE AND R.FAVORITES = M.MAX_FAVORITES ORDER BY R.FOOD_TYPE DESC;
NOT EXISTS 사용
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES FROM REST_INFO R1 WHERE NOT EXISTS ( SELECT 1 FROM REST_INFO R2 WHERE R1.FOOD_TYPE = R2.FOOD_TYPE AND R2.FAVORITES > R1.FAVORITES ) ORDER BY FOOD_TYPE DESC;