먼저 LEFT 조인 해보니, 유실된 기록들은 B.ANIMAL_ID 가 없는 특징이 있다
그래서 조건에 NULL 인 것들을 넣어서, 추출한다
이게 LV3 ?
SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_OUTS A
LEFT JOIN ANIMAL_INS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL
데이터 분석 팀에서는 우유(Milk)와 요거트(Yogurt)를 동시에 구입한 장바구니가 있는지 알아보려 합니다. 우유와 요거트를 동시에 구입한 장바구니의 아이디를 조회하는 SQL 문을 작성해주세요. 이때 결과는 장바구니의 아이디 순으로 나와야 합니다.
새로운 문제다!
조인으로 풀 생각을 했다.
셀프 조인을 해야 할 것이라고 생각했다.
그런데 가능한 경우의 수를 생각해보면 자기 장바구니에서 밀크를 하나 샀는데
밀크-밀크인 경우가 있을수도 있다.
그래서 제거해주기 위해
1. 조인할 대상 쿼리에 밀크, 요거트만 제한함
2. 쿼리한 결과가 밀크-밀크 처럼 중복인 경우를 제외했다.
SELECT DISTINCT A.CART_ID
FROM CART_PRODUCTS A
LEFT JOIN CART_PRODUCTS B
ON A.CART_ID = B.CART_ID
WHERE A.NAME IN ('Milk','Yogurt')
AND B.NAME IN ('Milk','Yogurt')
AND CONCAT(A.NAME,B.NAME) NOT IN ('MilkMilk','YogurtYogurt')
이게 레벨 3?
SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS A
LEFT JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.DATETIME > B.DATETIME
ORDER BY A.DATETIME ASC
테이블에서 특정 조건을 만족하는 행을 쿼리하는 문제.
여기서 특정 조건은 테이블에 동일한 HOST ID 가 2개 이상 존재하는 행이다.
ORACLE TABLE 이라면 ROW_NUMBERS 쓰면 될텐데
1. MYSQL 이니, GROUP BY 로 COUNT를 구해서 1이하인 것들은 거르고
2. 조인한다
SELECT B.ID, B.NAME, B.HOST_ID
FROM PLACES B
LEFT JOIN (
SELECT A.HOST_ID, COUNT(*) AS CNT
FROM PLACES A
GROUP BY A.HOST_ID
HAVING CNT > 1
) SUB_A
ON B.HOST_ID = SUB_A.HOST_ID
WHERE SUB_A.HOST_ID IS NOT NULL
다음에 나머지 4문제를 풀기로 한다.