(복습용) 프로그래머스 SQL Lv.3 이상 문제 풀기 - 1

2400·2022년 5월 2일
0

없어진 기록 찾기

먼저 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문제를 풀기로 한다.

profile
공부용 혹은 정리용 혹은 개인저장용

0개의 댓글

Powered by GraphCDN, the GraphQL CDN