241022_TIL

J Lee·2024년 10월 22일
0

아무리 사소하더라도 배움이 없는 날은 없다.

SQL 문제풀이 복습


Leetcode

문제 링크
1트(7/17)의 풀이와 다른 건 모두 똑같지만
이번에는 cross join이 아니라 그냥 (inner) join을 썼다.
굳이 cross join을 써서 모든 경우의 수를 다 뽑을 필요가 없음.

그리고 join의 조건은

  1. account_id가 같고
  2. ip_address는 서로 다른데
  3. login-logout의 시간대가 겹치는 경우 (즉, l2.login이 l1의 login과 logout 사이에 들어오는 경우)

이렇게 3개를 주면 된다.
어렵지는 않지만 join의 조건을 잘 줘야 하는 문제.

SELECT DISTINCT l1.account_id
FROM   LogInfo l1
       JOIN LogInfo l2
         ON l1.account_id = l2.account_id
            AND l1.ip_address <> l2.ip_address
            AND ( l2.login BETWEEN l1.login AND l1.logout );

문제 링크
기본적인 join 문제.

SELECT firstName,
       lastName,
       city,
       state
FROM   Person p
       LEFT JOIN Address a
              ON p.personId = a.personId;

문제 링크

SELECT product_id
FROM   Products
WHERE  low_fats = 'Y'
       AND recyclable = 'Y';

프로그래머스

문제 링크
1트(6/24) 풀이와 달라진 부분

  1. 굳이 join 뒤에 where절을 넣을 필요 없음.
    어차피 문제에서 요구한 건 parent_id가 없는 것들 뿐이므로
    그냥 join을 할 때 조건으로 'parent_item_id가 null인 것'을 추가하면 됨.
SELECT i.ITEM_ID,
       i.ITEM_NAME
FROM   ITEM_INFO i
       JOIN ITEM_TREE t
         ON i.ITEM_ID = t.ITEM_ID
            AND t.PARENT_ITEM_ID IS NULL
ORDER  BY 1;

문제 링크

SELECT Sum(price) AS "TOTAL_PRICE"
FROM   ITEM_INFO
WHERE  RARITY = 'LEGEND';

문제 링크
1트(4/8) 때 풀이를 보면 이상한 말을 써 놓았다..ㅎㅎ

join의 조건에 일치하는 데이터만 뽑아올 거기 때문에
사실 left join이 아니라 그냥 join을 쓰는 게 더 깔끔하고,
(left join을 쓰면 경우에 따라서는 reply가 없는 게시물까지 다 나오게 됨)
위 문제에서와 동일하게 where절을 쓸 필요 없이 join 조건에서 다 해결할 수 있다.

한 가지 문제를 풀면서 들었던 의문은
created_date에 그냥 date 함수를 쓰면 적용이 안 되고
꼭 date_format으로 써야만 적용되게 해 놓았다는 점이었는데,
무슨 문제인지 정확히는 모르겠지만 그냥 넘어가기로.

SELECT b.TITLE,
       b.BOARD_ID,
       r.REPLY_ID,
       r.WRITER_ID,
       r.CONTENTS,
       Date_format(r.CREATED_DATE, '%Y-%m-%d') AS "CREATED_DATE"
FROM   USED_GOODS_BOARD b
       JOIN USED_GOODS_REPLY r
         ON b.BOARD_ID = r.BOARD_ID
            AND Date_format(B.CREATED_DATE, '%Y-%m') = '2022-10'
ORDER  BY 6,
          1;

문제 링크
이건 예전에 풀었다가 링크를 안 남겨둔 건지 찾질 못하겠다.

SELECT BOARD_ID,
       WRITER_ID,
       TITLE,
       PRICE,
       CASE
         WHEN STATUS = 'SALE' THEN '판매중'
         WHEN STATUS = 'RESERVED' THEN '예약중'
         WHEN STATUS = 'DONE' THEN '거래완료'
       end AS "STATUS"
FROM   USED_GOODS_BOARD
WHERE  CREATED_DATE = '2022-10-05'
ORDER  BY 1 DESC;

문제 링크
join과 서브쿼리, concat이 조합된 좋은 문제였다.

SELECT Concat('/home/grep/src/', f.BOARD_ID, '/', FILE_ID, FILE_NAME, FILE_EXT)
       AS
       "FILE_PATH"
FROM   USED_GOODS_FILE f
       JOIN (SELECT BOARD_ID
             FROM   USED_GOODS_BOARD
             WHERE  VIEWS = (SELECT Max(VIEWS)
                             FROM   USED_GOODS_BOARD)) a
         ON f.BOARD_ID = a.BOARD_ID
ORDER  BY f.FILE_ID DESC;
profile
기본기를 소홀히 하지 말자

0개의 댓글

관련 채용 정보