728x90
https://programmers.co.kr/learn/courses/30/lessons/62284
우유( Milk )와 요거트( Yogurt )를 동시에 구입한 장바구니의 아이디를 오름차순으로 조회하는 SQL 문
# 우유를 구입한 장바구니 아이디와, 요거트를 구입한 장바구니 아이디의 교집합을 구하는 방법
/* Oracle DB 에서만 가능한 방법 ( MySQL 에서는 INTERSECT 연산을 지원하지 않음 ) */
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME = 'Milk'
INTERSECT
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME = 'Yogurt'
ORDER BY CART_ID;
# 요거트를 구입한 장바구니 아이디를 구하는 쿼리를 서브로 하여
그 중에서 우유를 구입한 장바구니 아이디와 일치하는 것을 구하는 방법
## IN
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME = 'Milk'
AND CART_ID IN (
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME = 'Yogurt'
)
ORDER BY CART_ID;
## EXISTS
SELECT CART_ID
FROM CART_PRODUCTS A
WHERE NAME = 'Milk'
AND EXISTS (
SELECT CART_ID
FROM CART_PRODUCTS B
WHERE A.CART_ID = B.CART_ID AND NAME = 'Yogurt'
)
ORDER BY CART_ID;
# 셀프 조인( 같은 테이블끼리 조인 ) 하여 각각 별칭 지정 후 하나는 우유, 다른 하나는 요거트 조건 지정하는 방법
SELECT DISTINCT CART_ID
FROM CART_PRODUCTS A JOIN CART_PRODUCTS B
USING ( CART_ID )
WHERE A.NAME = 'Milk' AND B.NAME = 'Yogurt'
ORDER BY CART_ID;
# 장바구니 아이디를 기준으로 구입한 상품의 종류의 수가 우유, 요거트 2 개인 것을 구하는 방법
( 종류( NAME ) 에 대해 중복 제거( DISTINCT ) 후 수행 -- 예를 들어 우유 종류만 각각 다른 제품으로 여러 개 구입 했을 수도 있으므로 )
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME IN ( 'Milk', 'Yogurt' )
GROUP BY CART_ID
HAVING COUNT( DISTINCT( NAME ) ) = 2
ORDER BY CART_ID;
반응형