프로그래머스_우유와 요거트가 담긴 장바구니_Oracle

2022. 9. 29. 11:42DataBase/SQL Query Problem

728x90
반응형
SMALL

뭔가 간단해 보이면서도 간단하지 않았던 문제다.

나는 뭔가 요령이 없어서 그냥 문제에서 주어진 조건대로

서브쿼리를 무작정 만들어서 where 절에 넣어주었다.

 

정답이 나오긴 했는데 딱봐도 데이터가 많을 경우에 효율이 별로 좋지 못할 것 같고,

다른 방법이 분명 있을 것 같아서 찾아보았는데 역시나 있었다.

 

바로 셀프 조인을 이용한 방법이다.

SELECT DISTINCT(A.CART_ID)
FROM CART_PRODUCTS A INNER JOIN CART_PRODUCTS B
ON A.CART_ID=B.CART_ID
WHERE A.NAME='Yogurt' AND B.NAME='Milk'
ORDER BY A.CART_ID

INNER JOIN을 사용하는데 CART_ID가 같은 것끼리 모아서 요거트와 우유를 산 레코드들을 보이면 된다.

처음에 요거트와 밀크의 순서를 고려해서 WHERE절을 짜야되나 생각해봤는데 셀프 조인을 하면 모든 경우의 수들이

생기므로 이는 고려하지 않아도 된다고 생각했다.

(이 부분은 저도 아리까리해서 잘 아시는 분들은 댓글로 조언해주시면 감사하겠습니다.)

그리고 한 CART_ID가 여러 개의 요거트나 우유를 사는 경우도 있는 것 같다. SELECT절에 DISTINCT를 빼고 실행하면

같은 CART_ID가 여러개 나온다. 그래서 DISTINCT를 넣어주었다. 

 

이외에도 INTERSECT를 이용한 방법이 있었다.(이거까지 설명하긴...ㅋㅋ)

 

아래는 내가 처음에 제출한 정답 코드다.

SELECT CART_ID
FROM CART_PRODUCTS
WHERE CART_ID IN (
    SELECT CART_ID
    FROM CART_PRODUCTS
    WHERE NAME='Yogurt'
) AND
CART_ID IN (
    SELECT CART_ID
    FROM CART_PRODUCTS
    WHERE NAME='Milk'
)
GROUP BY CART_ID
ORDER BY CART_ID
728x90
반응형
LIST