ORACLE 비집계 컬럼과 GROUP BY 패턴

알비레오·2026년 5월 7일

DB

목록 보기
16/16

ORACLE에서는 SELECT 내에 쓰인 비집계 컬럼을 모두 GROUP BY에 포함시켜야만 에러가 발생하지 않는다.

때문에 SELECT에 뽑고 싶은 데이터를 모두 포함시키면서 동시에 특정 컬럼별로 집계할 때 GROUP BY에 불필요한 컬럼을 함께 넣어주어야 하고 이 문제로 인해 잘 못 집계되는 경우도 발생할 수 있다.

이 상황이 은근 많이 마주하게 되어,
비집계 컬럼을 모두 뽑아내면서, 원하는 대로 집계하기 위해 쓰기 좋은 패턴 3가지를 정리해본다.

PATTERN 1

윈도우 함수 사용

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;

PATTERN 2

서브쿼리 + 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;

PATTERN 3

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;

장단점 비교

0개의 댓글