본문 바로가기

프로그래머스 풀이/Lv 4

[프로그래머스 SQL] 우유와 요거트가 담긴 장바구니 (ORACLE)

728x90

https://school.programmers.co.kr/learn/courses/30/lessons/62284

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

하나의 테이블이지만 인라인뷰를 두개 만들어 조인하면 풀 수 있다.

하지만 이것은 비효율적인 풀이이고 정해는 IN을 사용해야하는 것으로 생각된다.

 

1번 Join 풀이

-- 코드를 입력하세요
SELECT DISTINCT (y.CART_ID)
FROM (
    SELECT CART_ID, NAME 
    FROM CART_PRODUCTS
    WHERE NAME = 'Yogurt'
) y
, 
(
    SELECT CART_ID, NAME
    FROM CART_PRODUCTS
    WHERE NAME = 'Milk'
) m 
WHERE y.CART_ID = m.CART_ID
ORDER BY y.CART_ID;

 

다른 사람이 보면 보기 힘들고 뭔가 쓰면서도 찝찝하다.

 

SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME IN('Yogurt', 'Milk')
GROUP BY CART_ID
HAVING COUNT(DISTINCT NAME) = 2
ORDER BY CART_ID;

 

간결하고 보기도편하다. 이게 정답인듯. 실무에서도 이렇게 짤 수 있어야한다.

그룹바이를 꼭 해야하는 이유는 만약 요거트만 3개를 산 사람이라면 요거트만 샀기 때문에 DISTINCT하여 카운팅해서 걸러줘야한다.

 

IN 함수는 OR와 같은 역할을 한다. 한번에 여러개를 체크하고 싶을 때 사용한다.