https://school.programmers.co.kr/learn/courses/30/lessons/131115
코드설명
MAX + NESTED SUBQUERY 를 활용합니다.
만약 그룹화된 함수를 사용하여 집계함수를 사용한다면, GROUP BY 를 사용해야하겠지만 단순히 하나의 테이블에서 최댓값을 구할때는 바로 적용하면 됩니다.
NESTED SUBQUERY는 WHERE 절 안에 들어간 SUBQUERY를 의미합니다.
정렬을 통해서도 사용해도되겠지만, 인덱스가 없을경우 해당 경우의 속도는 느릴것으로 예상되어 단순히 값을 가져와서 처리합니다.
만약, 서브쿼리를 사용하기 싫다면, LIMIT 1 으로 가격기준 내림차순 정렬하면 되겠지만, 더 직관적인 코드는 이번 코드라고 생각됩니다.
코드
-- 코드를 입력하세요
SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE
FROM FOOD_PRODUCT
WHERE PRICE = (SELECT MAX(PRICE) FROM FOOD_PRODUCT);
SELECT FP1.PRODUCT_ID, FP1.PRODUCT_NAME, FP1.PRODUCT_CD, FP1.CATEGORY, FP1.PRICE
FROM FOOD_PRODUCT AS FP1
WHERE FP1.PRICE = (select max(fp2.price) from food_product as fp2)
ORACLE
여러가지 풀이가 가능합니다.
1. NESTED SUB QUERY
SELECT FP.PRODUCT_ID, FP.PRODUCT_NAME, FP.PRODUCT_CD, FP.CATEGORY, FP.PRICE
FROM FOOD_PRODUCT FP
WHERE FP.PRICE = (SELECT MAX(PRICE) FROM FOOD_PRODUCT)
2. TOP-N 쿼리 : 만약, 가격이 같은데 비싼. 즉, 6500원 짜리가 3개 있다면 이 방식은 사용하지 못합니다.
SELECT * FROM (
SELECT FP.PRODUCT_ID, FP.PRODUCT_NAME, FP.PRODUCT_CD, FP.CATEGORY, FP.PRICE
FROM FOOD_PRODUCT FP
ORDER BY FP.PRICE DESC
)
WHERE ROWNUM = 1
2-1. 위의 단점을 피할려면 어떻게 해야할까요?
TOP-N QUERY 와 RANK() WINDOW FUNCTION을 함께 사용합니다.
SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE
FROM (
SELECT FP.PRODUCT_ID, FP.PRODUCT_NAME, FP.PRODUCT_CD, FP.CATEGORY, FP.PRICE, RANK() OVER (ORDER BY PRICE DESC) AS PRICE_RANK
FROM FOOD_PRODUCT FP
)
WHERE PRICE_RANK = 1
저는 처음에 WINDOW FUNCTION은 WHERE절이 모두 끝나고 구현된다는 점을 몰랐었기에 TOP-N QUERY 를 사용하지 않고, 아래와 같이 사용하면 되는것 아닌가? 라고 생각했습니다.
하지만, WHERE 절 이후 PRICE_RANK COLUMN이 생성되는 것이기에 아래 코드는 오류가 납니다.
SELECT FP.PRODUCT_ID, FP.PRODUCT_NAME, FP.PRODUCT_CD, FP.CATEGORY, FP.PRICE, RANK() OVER (ORDER BY PRICE DESC) AS PRICE_RANK
FROM FOOD_PRODUCT FP
WHERE PRICE_RANK = 1