[SQL] WHERE ~ IN을 이용하여 서브쿼리 JOIN과 동일한 효과 내기

전도운·2024년 7월 2일
0
post-custom-banner

카테고리별 최대값이 포함된 행만 추출하고자 한다. 이때 카테고리별 최대값을 요약하고 원본 테이블과 INNER JOIN하는 방법 외에 WHERE ~ IN 절을 이용하여 동일한 결과를 내는 방법을 소개하고자 한다.

  • REST_INFO 테이블에서 음식종류(FOOD_TYPE)별로 즐겨찾기수(FAVORITES)가 가장 많은 식당의 데이터를 추출하고자 한다. 서브쿼리를 이용하여 데이터를 추출하는 방법은 아래와 같다.

    • FOOD_TYPE별 FAVORITES의 최대값을 추출한 테이블을 원본 테이블과 JOIN하되, 최대값을 JOIN 조건으로 설정하는 방법을 이용한다.
SELECT A.FOOD_TYPE, A.REST_ID, A.REST_NAME, A.FAVORITES
    FROM REST_INFO A INNER JOIN 
        (SELECT FOOD_TYPE, MAX(FAVORITES) FAVORITES
        FROM REST_INFO
        GROUP BY FOOD_TYPE) B
    ON A.FOOD_TYPE = B.FOOD_TYPE AND A.FAVORITES = B.FAVORITES
    ORDER BY FOOD_TYPE DESC;
  • 위 방법은 JOIN문을 이용하기 때문에 alias를 사용하는 등 다소 구문이 복잡해지는 단점이 있다. 만약 조건을 더 많이 걸게 된다면 코드는 더욱 복잡해질 것이다.

  • 이때, 아래와 같이 WHERE ~ IN절과 서브쿼리를 이용하면 코드를 줄이면서 동일한 결과를 도출할 수 있다.

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
    FROM REST_INFO
    WHERE (FOOD_TYPE, FAVORITES) IN
    (SELECT FOOD_TYPE, MAX(FAVORITES)
    FROM REST_INFO GROUP BY FOOD_TYPE)
    ORDER BY FOOD_TYPE DESC;
  • 위 코드와 아래 코드의 차이점은, 위 코드는 서브쿼리가 두 테이블을 JOIN하는 데 사용된 반면, 아래 코드는 서브쿼리가 원본 테이블에 직접 조건을 걸 때 사용되었다는 것이다.

    • 결과는 동일하지만 해당 쿼리를 작성하는 목적이 원본 테이블에서 조건에 맞는 자료를 추출하는 것임을 고려할 때, 두 번째 코드가 목적에 더욱 적합한 것으로 판단된다.
profile
의미 있는 한걸음을 추구합니다.
post-custom-banner

0개의 댓글