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;