문제 설명
CART_PRODUCTS 테이블은 장바구니에 담긴 상품 정보를 담은 테이블입니다. CART_PRODUCTS 테이블의 구조는 다음과 같으며, ID, CART_ID, NAME, PRICE는 각각 테이블의 아이디, 장바구니의 아이디, 상품 종류, 가격을 나타냅니다.
NAME | TYPE |
ID | INT |
CART_ID | INT |
NAME | VARCHAR |
PRICE | INT |
데이터 분석 팀에서는 우유와 요거트를 동시에 구입한 장바구니가 있는지 알아보려 합니다. 우유와 요거트를 동시에 구입한 장바구니의 아이디를 조회하는 SQL 문을 작성해주세요. 이때 결과는 장바구니의 아이디 순으로 나와야 합니다.
예시
예를 들어 CART_PRODUCTS 테이블이 다음과 같다면
CART_PRODUCTS 테이블
ID | CART_ID | NAME | PRICE |
5488 | 83 | 알루미늄 호일 | 2980 |
8435 | 83 | 우유 | 1880 |
5489 | 286 | 반찬류 | 3700 |
5491 | 286 | 요거트 | 2980 |
5504 | 286 | 우유 | 1880 |
8437 | 448 | 요거트 | 2980 |
8454 | 448 | 우유 | 1880 |
5490 | 1034 | 케첩 | 1380 |
5492 | 1034 | 일회용품 | 1080 |
- 83번 장바구니에는 우유만 있고 요거트가 없습니다.
- 286번 장바구니에는 우유와 요거트가 모두 있습니다.
- 448번 장바구니에는 우유와 요거트가 모두 있습니다.
- 1034번 장바구니에는 우유와 요거트가 모두 없습니다.
따라서 SQL 문을 실행하면 다음과 같이 나와야 합니다.
CART_ID |
286 |
448 |
풀이
1.SELF JOIN
1
2
3
4
5
|
SELECT DISTINCT C.CART_ID
FROM CART_PRODUCTS C, CART_PRODUCTS T
WHERE C.CART_ID = T.CART_ID
AND (C.NAME ='우유' AND T.NAME ='요거트')
ORDER BY C.CART_ID
|
셀프조인을 이용해서 풀이해 주었다. 자신의 테이블을 두개를 ID를 기준으로 조인한 뒤에 우유와 요거트가 함께 존재한다면 둘다 출력한뒤 DISTINCT를 이용해 중복제거 해서 반환해주었다.
다른 풀이방법도 궁금해서 찾아보았다.
2. INTERSECT
다른 풀이방법으로는 교집합(INTERSECT)를 이용해도 풀이할 수 있다
1
2
3
4
5
6
7
8
|
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME = '우유'
INTERSECT
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME = '요거트'
ORDER BY CART_ID
|
우유를 가지는 ID를 추출한 테이블, 같은 방식으로 요거트를 가진 ID를 추출한 테이블의 교집합을 구하면 해결된다.
3. SubQuery
1
2
3
4
5
6
7
8
9
10
11
12
|
SELECT
CART_ID
FROM
CART_PRODUCTS
WHERE CART_ID IN ( SELECT
CART_ID
FROM
CART_PRODUCTS
WHERE
NAME = '우유')
AND NAME = '요거트'
ORDER BY CART_ID ASC;
|
WHERE절에 그냥 NAME을 단순 2개를 비교하는 조건은 없기때문에 서브쿼리로 하나를 구해준뒤 비교해주는 형식으로 풀이하였다.
https://programmers.co.kr/learn/courses/30/lessons/62284
'Web > Oracle SQL' 카테고리의 다른 글
[PROGRAMMERS Level-4] 보호소에서 중성화한 동물 [Oracle] (0) | 2020.03.29 |
---|---|
[PROGRAMMER Level-4] 입양 시각 구하기(2)[Oracle] (0) | 2020.03.29 |
[SQL] 변환함수,서식지정자 (0) | 2020.03.27 |
[SQL] 함수(Functions) (0) | 2020.03.27 |
[SQL] 정의와 기본문법 (0) | 2020.03.27 |