Contents
내가 작성한 쿼리
처음에는 모든 제품의 가격이 10입니다.
2019-08-16일에 모든 제품의 가격을 찾기 위한 해결책을 작성하세요.
결과 테이블을 순서에 상관없이 반환하세요.내가 작성한 쿼리
MySQL
-- 8월 16일 이전것들 추출하는 CTE
WITH price_history AS (
    SELECT *
    FROM Products
    WHERE change_date <= '2019-08-16'
),
-- 각 id별 가장 마지막으로 변경된 날 추출하는 CTE
latest_price AS (
    SELECT
        product_id,
        MAX(change_date) AS latest_date
    FROM price_history
    GROUP BY product_id
)
SELECT
    p.product_id,
    IFNULL(ph.new_price, 10) AS price
FROM (
    SELECT DISTINCT product_id FROM Products
) p
LEFT JOIN latest_price lp -- id 기준으로 JOIN
    ON p.product_id = lp.product_id
LEFT JOIN price_history ph -- id, 날짜 기준으로 JOIN
    ON p.product_id = ph.product_id
        AND lp.latest_date = ph.change_date
ORDER BY p.product_id;Oracle
-- 8월 16일 이전것들 추출하는 CTE
WITH price_history AS (
    SELECT *
    FROM Products
    WHERE change_date <= TO_DATE('2019-08-16', 'YYYY-MM-DD')
),
-- 각 id별 가장 마지막으로 변경된 날 추출하는 CTE
latest_price AS (
    SELECT
        product_id,
        MAX(change_date) AS latest_date
    FROM price_history
    GROUP BY product_id
)
SELECT
    p.product_id,
    NVL(ph.new_price, 10) AS price
FROM (
    SELECT DISTINCT product_id FROM Products
) p
LEFT JOIN latest_price lp -- id 기준으로 JOIN
    ON p.product_id = lp.product_id
LEFT JOIN price_history ph -- id, 날짜 기준으로 JOIN
    ON p.product_id = ph.product_id
    AND lp.latest_date = ph.change_date
ORDER BY p.product_id;
차이점
| 항목 | MySQL | Oracle | 
| 날짜 표시 방식 차이 | '2019-08-16' | TO_DATE('2019-08-16', 'YYYY-MM-DD') | 
| NULL 대체 함수 | IFNULL(a, b) | NVL(a, b) | 
Share article
