WITH a AS (
SELECT *
FROM advertiser
LEFT JOIN daily_pay
USING (user_id)
UNION
SELECT *
FROM advertiser
RIGHT JOIN daily_pay
USING (user_id)
)
SELECT
user_id
, CASE
WHEN paid IS NULL THEN 'CHURN'
WHEN paid IS NOT NULL AND status in ('NEW','EXISTING','RESURRECT') THEN 'EXISTING'
WHEN paid IS NOT NULL AND status = 'CHURN' THEN 'RESURRECT'
WHEN paid IS NOT NULL AND status IS NULL THEN 'NEW'
END AS new_status
FROM a
ORDER BY user_id
비고 : 지원하는 언어인 PostgreSQL에서는 OUTER JOIN을 지원하지 않는 거 같다. 그래서 LEFT JOIN과 RIGHT JOIN을 UNION으로 병합 후에 조건에 따라 변경했다.
SELECT
CONCAT(p1.topping_name,',',p2.topping_name,',',p3.topping_name) AS pizza
, p1.ingredient_cost+p2.ingredient_cost+p3.ingredient_cost AS total_cost
FROM pizza_toppings p1, pizza_toppings p2, pizza_toppings p3
WHERE p1.topping_name < p2.topping_name
AND p2.topping_name < p3.topping_name
ORDER BY total_cost DESC
비고 : FROM절에 1, 2, 3 테이블을 하면 셀프 조인이 가능하다. WHERE절에 부등호로 중복을 제거했다. SQL에서는 부등호로 문자를 비교할 수 있다. 기준은 사전식 정렬이다. 예를 들어 apple < banana인 셈이다.