240914_TIL

J Lee·2024년 9월 14일

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

SQL 문제풀이 복습

문제 링크

WITH result
     AS (SELECT seat_id,
                seat_id - Row_number()
                            OVER(
                              ORDER BY seat_id) AS "cal"
         FROM   cinema
         WHERE  free = '1')
SELECT seat_id
FROM   result
WHERE  cal IN (SELECT cal
               FROM   result
               GROUP  BY 1
               HAVING Count(*) >= 2);

문제 링크
6/30에 이어 2번째로 풀게 된 문제.
지난번에는 CTE를 써서 RED와 연관이 있는 사람의 id를 구한 후
left join으로 발라냈는데, 오늘은 CTE 없이 서브쿼리로 구했다.

SELECT s.name
FROM   salesperson s
       LEFT JOIN (SELECT sales_id
                  FROM   orders o
                         JOIN company c
                           ON o.com_id = c.com_id
                  WHERE  c.name = 'RED') a
              ON s.sales_id = a.sales_id
WHERE  a.sales_id IS NULL;

문제 링크
그렇게 어렵지 않은 Tree node 문제.

case when을 써서 Root / Inner / Leaf를 구분해야 하는데,
Inner의 조건이 가장 복잡하니 Root와 Leaf를 먼저 구하고
그 밖의 나머지(else)들을 모두 Inner로 보면 조건이 조금 더 간단해진다.

SELECT DISTINCT t1.id,
                CASE
                  WHEN t1.p_id IS NULL THEN "Root"
                  WHEN t2.id IS NULL
                       AND t2.p_id IS NULL THEN "Leaf"
                  ELSE "Inner"
                end AS 'type'
FROM   tree t1
       LEFT JOIN tree t2
              ON t1.id = t2.p_id;
profile
기본기를 소홀히 하지 말자

0개의 댓글