[공부] 프로그래밍/DB

[SQL 공부] LEFT JOIN

woodisco 2023. 4. 10. 15:34

 

LEFT JOIN = LEFT OUTER JOIN

-> FROM의 테이블을 왼쪽으로 정렬하여 전부 표시한다.

 

① posts 테이블

id
body
user_id
1
Hello
3
2
Hi
1
3
Good
2

 

② users 테이블

id
name
1
taro
2
jiro
3
hanako
4
saito

 

위의 두 테이블을 LEFT 조인을 할 경우

SELECT *
FROM users
LEFT JOIN posts
ON users.id = posts.user_id

실행결과는

id
name
id
body
user_id
3
hanako
1
Hello
3
1
jiro
2
Hi
1
2
taro
3
Good
2
4
saito
NULL
NULL
NULL

 

WITH tmp AS
 (
    SELECT top 100
        ss_account_id,
        SUM(revenue) AS sum_revenue,
        SUM(clicks) AS sum_clicks,
        SUM(impressions) AS sum_impressions
    FROM 테이블명1
    WHERE log_date BETWEEN '해당날짜' AND '해당날짜'
    GROUP BY ss_account_id
    ORDER BY sum_revenue DESC 
 )
 
SELECT
    a.ss_account_id,
    b.account_name,
    a.sum_revenue AS rev,
    a.sum_clicks AS clicks,
    a.sum_impressions AS impressions
FROM tmp AS a
LEFT JOIN 테이블명2 AS b ON a.ss_account_id = b.ss_account_id
;
WITH tmp1 AS
 (
    SELECT 
        log_date,
        account_id,
        SUM(revenue) AS sum_revenue,
        SUM(clicks) AS sum_clicks,
        SUM(impressions) AS sum_impressions
    FROM 테이블명1
    WHERE log_date BETWEEN '해당날짜' AND '해당날짜'
    GROUP BY 1,2
)
  , tmp2 AS
(
    SELECT 
    	 log_date,
    	 account_id,
         SUM(all_conversions) AS sum_conversions
    FROM 테이블명2
    WHERE nonpayment_flag = 1
    AND log_date BETWEEN '해당날짜' AND '해당날짜'
    GROUP BY 1,2
)
  , tmp3 AS
(
    SELECT
  	    account_id,
  	    account_name
    FROM 테이블명3
  	GROUP by 1,2
)

SELECT TOP 100
    c.account_id,
    c.account_name,
    a.sum_revenue AS rev,
    a.sum_clicks AS clicks,
    a.sum_impressions AS impressions,
    b.sum_conversions AS conversion
FROM tmp1 AS a
LEFT JOIN  tmp2 AS b ON a.account_id = b.account_id
LEFT JOIN tmp3 AS c ON a.account_id = c.account_id
ORDER BY rev DESC 
;