[SQL BOOSTER] 3-2. OUTER JOIN
by Hi.Claire๐ SQL BOOSTER (์ ์ผํ, DBian)
CH3. JOIN
3-2. OUTER JOIN
3-2-1. OUTER JOIN ์ดํดํ๊ธฐ
Outer Join์ ์กฐ์ธ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์ ๋ฐ์ดํฐ๋ ๊ฒฐ๊ณผ์ ๋์จ๋ค.
Outer Join์ ๋ฐ์ดํฐ ์งํฉ
๊ธฐ์ค ๋ฐ์ดํฐ ์งํฉ : Outer Join์ ๊ธฐ์ค์ด ๋๋ ์งํฉ, Outer ์งํฉ์ด๋ผ๊ณ ๋ ํ๋ค.
์ฐธ์กฐ ๋ฐ์ดํฐ ์งํฉ : Outer Join์ ์ฐธ์กฐ๊ฐ ๋๋ ์งํฉ, Inner ์งํฉ์ด๋ผ๊ณ ๋ ํ๋ค.
๊ธฐ์ค ๋ฐ์ดํฐ ์งํฉ(Outer ์งํฉ)์ ์กฐ์ธ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์๋ ๋ชจ๋ ๊ฒฐ๊ณผ์ ํฌํจ๋๋ค.
๋จ, ํํฐ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
Outer Join์ ์ฌ์ฉํ๋ ค๋ฉด ์ฐธ์กฐ ๋ฐ์ดํฐ ์งํฉ์ชฝ์ ์กฐ์ธ ์กฐ๊ฑด ์ปฌ๋ผ์ (+) ํ์๋ฅผ ์ถ๊ฐํ๋ฉด ๋๋ค.
ANSI๋ก๋ ์ฐธ์กฐ ๋ฐ์ดํฐ ์งํฉ์ LEFT OUTER JOINํ๋ค.
๊ทธ๋ผ ๋จผ์ Inner Join๊ณผ Outer Join์ ๋น๊ตํด๋ณด์.
์์1. ๊ณ ๊ฐ 'CUS_0002'์ ๊ณ ๊ฐ(M_CUS) ์ ๋ณด์ ์์ดํ ํ๊ฐ(T_ITM_EVL) ์ ๋ณด ๊ตฌํ๊ธฐ
๊ณ ๊ฐ(M_CUS) ๋ฐ์ดํฐ ์งํฉ์ ๊ณ ๊ฐ 'CUS_0002'์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
SELECT *
FROM m_cus cus
WHERE cus.cus_id = 'CUS_0002';
์์ดํ ํ๊ฐ(T_ITM_EVL) ๋ฐ์ดํฐ ์งํฉ์ ๊ณ ๊ฐ 'CUS_0002'์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋ค.
SELECT *
FROM t_itm_evl evl
WHERE evl.cus_id = 'CUS_0002';
์ด๋ ์กฐ์ธ ์กฐ๊ฑด(cus.cus_id = evl.cus_id)์ ๋ํ Inner Join๊ณผ Outer Join์ ๊ฒฐ๊ณผ๊ฐ ์ด๋ป๊ฒ ๋ฌ๋ผ์ง๋์ง ์ดํด๋ณด์.
(Inner Join, Oracle)
SELECT cus.cus_id, cus.cus_nm, evl.cus_id, evl.itm_id, evl.evl_lst_no
FROM m_cus cus,
t_itm_evl evl
WHERE cus.cus_id = 'CUS_0002'
AND cus.cus_id = evl.cus_id;
Inner Join์ ์๋ฌด ๊ฒฐ๊ณผ๋ ์กฐํ๋์ง ์๋๋ค.
(Outer Join, Oracle)
SELECT cus.cus_id, cus.cus_nm, evl.cus_id, evl.itm_id, evl.evl_lst_no
FROM m_cus cus,
t_itm_evl evl
WHERE cus.cus_id = 'CUS_0002'
AND cus.cus_id = evl.cus_id (+);
๋ฐ๋ฉด Outer Join์ 'CUS_0002' ๊ณ ๊ฐ์ ์ ๋ณด๊ฐ ์กฐํ๋๋ค.
์ด์ ๊ฐ์ด Outer Join์ ์กฐ์ธ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ๋ชปํ ๋ฐ์ดํฐ๋ ๊ฒฐ๊ณผ์ ํฌํจ๋์ด ๋์จ๋ค.
์ด๋ ๊ธฐ์ค ๋ฐ์ดํฐ ์งํฉ์ ์ฐธ์กฐ์ชฝ ๊ฒฐ๊ณผ๋ ๊ฐ์ด NULL๋ก ์ฑ์์ง๊ฒ ๋๋ค.
์์1์ ANSI ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ๋ค.
(Inner Join, ANSI)
SELECT cus.cus_id, cus.cus_nm, evl.cus_id, evl.itm_id, evl.evl_lst_no
FROM m_cus cus
JOIN t_itm_evl evl
ON cus.cus_id = evl.cus_id
WHERE cus.cus_id = 'CUS_0002';
(Outer Join, ANSI)
SELECT cus.cus_id, cus.cus_nm, evl.cus_id, evl.itm_id, evl.evl_lst_no
FROM m_cus cus
LEFT JOIN t_itm_evl evl
ON cus.cus_id = evl.cus_id
WHERE cus.cus_id = 'CUS_0002';
์์2. ๋ ๋ช ์ ๊ณ ๊ฐ('CUS_0002', 'CUS_0011')์ ์์ดํ ํ๊ฐ(T_ITM_EVL)์ Outer Joinํ๊ธฐ
(๋์ ํ์ด, ANSI)
SELECT cus.cus_id, cus.cus_nm, evl.cus_id, evl.itm_id, evl_lst_no
FROM m_cus cus
LEFT JOIN t_itm_evl evl
ON cus.cus_id = evl.cus_id
WHERE cus.cus_id IN ('CUS_0002', 'CUS_0011')
ORDER BY 1;
(๊ต์ฌ ํ์ด, Oracle)
SELECT T1.CUS_ID ,T1.CUS_NM ,T2.CUS_ID ,T2.ITM_ID ,T2.EVL_LST_NO
FROM M_CUS T1
,T_ITM_EVL T2
WHERE T1.CUS_ID IN ('CUS_0002','CUS_0011')
AND T1.CUS_ID = T2.CUS_ID(+)
ORDER BY T1.CUS_ID;
์ SQL์ด ์ฒ๋ฆฌ๋๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
1. m_cus์์ 'CUS_0002', 'CUS_0011' ๋ ๊ฑด์ ๊ณ ๊ฐ์ด ํํฐ๋ง ๋๋ค.
2. cus.cus_id = evl.cus_id์ ์กฐ๊ฑด์ผ๋ก Outer Join์ ์ํํ๋ค.
- m_cus๋ ๊ธฐ์ค ๋ฐ์ดํฐ ์งํฉ(Outer ์งํฉ)์ด๋ค.
- t_itm_evl์ ์ฐธ์กฐ ๋ฐ์ดํฐ ์งํฉ(Inner ์งํฉ)์ด๋ค.
- ์ฐธ์กฐ ๋ฐ์ดํฐ ์งํฉ์ 'CUS_0002'๋ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก NULL ๊ฐ์ผ๋ก ์ฑ์์ง๋ค.
3-2-2. OUTER JOIN์ ํํฐ ์กฐ๊ฑด
Outer Join์์๋ ์ฐธ์กฐ ๋ฐ์ดํฐ ์งํฉ์ ํํฐ ์กฐ๊ฑด์๋ (+) ํ์๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค.
์ฐธ์กฐ ๋ฐ์ดํฐ ์งํฉ์ ํํฐ ์กฐ๊ฑด์ (+) ์ฌ์ฉ ์ Outer Join ์ ์ ํํฐ ์กฐ๊ฑด์ด ์ฌ์ฉ๋๋ค.
์ฐธ์กฐ ๋ฐ์ดํฐ ์งํฉ์ ํํฐ ์กฐ๊ฑด์ (+) ๋ฏธ์ฌ์ฉ ์ Outer Join ํ, ์กฐ์ธ ๊ฒฐ๊ณผ์ ํํฐ ์กฐ๊ฑด์ด ์ฌ์ฉ๋๋ค.
์์1. ํํฐ ์กฐ๊ฑด์ (+) ํ์ ์ ๋ฌด์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ ๋น๊ต
๊ณ ๊ฐ('CUS_0073')์ ์์ดํ ํ๊ฐ(T_ITM_EVL)์ Outer Joinํ๊ธฐ
(์ฐธ์กฐ ์ชฝ ํํฐ ์กฐ๊ฑด์ (+) ํ์ ์์)
SELECT cus.cus_id, cus.cus_nm, evl.cus_id, evl.itm_id, evl.evl_lst_no, evl.evl_dt
FROM m_cus cus
, t_itm_evl evl
WHERE cus.cus_id IN ('CUS_0073')
AND cus.cus_id = evl.cus_id(+)
AND evl.evl_dt >= to_date('20170201', 'yyyymmdd')
AND evl.evl_dt < to_date('20170301', 'yyyymmdd');
์ ์ฟผ๋ฆฌ์์๋ Outer Join์ ์ฐธ์กฐ ๋ฐ์ดํฐ ์งํฉ ์ชฝ ํํฐ ์กฐ๊ฑด์ (+) ํ์๊ฐ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก Outer Join์ด ๋จผ์ ์ฒ๋ฆฌ๋ ํ, ๊ทธ ์กฐ์ธ ๊ฒฐ๊ณผ์ ํํฐ ์กฐ๊ฑด์ด ์ ์ฉ๋๋ค.
Outer Join์ด ์ด๋ฃจ์ด์ง๋ฉด ์ฐธ์กฐ ๋ฐ์ดํฐ ์งํฉ์ EVL_DT๋ NULL์ด ๋๋ค.
์ด NULL ๊ฐ์ ๋ํด 6, 7๋ฒ ๋ผ์ธ์ ํํฐ ์กฐ๊ฑด์ ์ ์ฉํ๋ฉด ์ด๋ฅผ ๋ง์กฑํ๋ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฏ๋ก ๊ฒฐ๊ตญ ์กฐํ๋๋ ๋ฐ์ดํฐ๊ฐ ์๋ค.
์ด๋ ๊ฒฐ๊ณผ์ ์ผ๋ก Inner Join๊ณผ ๊ฐ๋ค.
(์ฐธ์กฐ ์ชฝ ํํฐ ์กฐ๊ฑด์ (+) ํ์ ์์)
SELECT cus.cus_id, cus.cus_nm, evl.cus_id, evl.itm_id, evl.evl_lst_no, evl.evl_dt
FROM m_cus cus
, t_itm_evl evl
WHERE cus.cus_id IN ('CUS_0073')
AND cus.cus_id = evl.cus_id(+)
AND evl.evl_dt(+) >= to_date('20170201', 'yyyymmdd')
AND evl.evl_dt(+) < to_date('20170301', 'yyyymmdd');
์์ ๊ฐ์ด Outer Join ์์๋ ์ฐธ์กฐ ์ชฝ ํํฐ ์กฐ๊ฑด์ (+) ํ์๋ฅผ ํด์ค์ผ ์ํ๋ ๋ฐ์ดํฐ๊ฐ ์กฐํ๋๋ค.
์์ ์์ 1์ ANSI๋ก ํ์ดํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
(WHERE ์กฐ๊ฑด์ ์ฐธ์กฐ ๋ฐ์ดํฐ ์งํฉ์ ํํฐ ์กฐ๊ฑด์ ์ค ๊ฒฝ์ฐ(ANSI))
SELECT cus.cus_id, cus.cus_nm, evl.cus_id, evl.itm_id, evl.evl_lst_no, evl.evl_dt
FROM m_cus cus
LEFT JOIN t_itm_evl evl
ON cus.cus_id = evl.cus_id
WHERE cus.cus_id = 'CUS_0073'
AND evl.evl_dt >= to_date('20170201', 'yyyymmdd')
AND evl.evl_dt < to_date('20170301', 'yyyymmdd');
(JOIN ์กฐ๊ฑด์ ์ฐธ์กฐ ๋ฐ์ดํฐ ์งํฉ์ ํํฐ ์กฐ๊ฑด์ ์ค ๊ฒฝ์ฐ(ANSI))
SELECT cus.cus_id, cus.cus_nm, evl.cus_id, evl.itm_id, evl.evl_lst_no, evl.evl_dt
FROM m_cus cus
LEFT JOIN t_itm_evl evl
ON cus.cus_id = evl.cus_id
AND evl.evl_dt >= to_date('20170201', 'yyyymmdd')
AND evl.evl_dt < to_date('20170301', 'yyyymmdd')
WHERE cus.cus_id = 'CUS_0073';
ANSI๋ก Outer Joinํ ๋์๋ ์ฐธ์กฐ ๋ฐ์ดํฐ ์งํฉ ์ชฝ ํํฐ ์กฐ๊ฑด์ Join ์กฐ๊ฑด์ ์ฃผ์ด์ผ ์ํ๋ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
3-2-3. ์คํ์ด ๋ถ๊ฐ๋ฅํ OUTER JOIN
Oracle์ Outer Join์์ ์ฐธ์กฐ ๋ฐ์ดํฐ ์งํฉ์ ๊ธฐ์ค ๋ฐ์ดํฐ ์งํฉ์ ๋์์ ๋ ๊ฐ ์ด์ ๊ฐ์ง ์ ์๋ค.
์์1. ์คํ์ด ๋ถ๊ฐ๋ฅํ Outer Join
SELECT T1.CUS_ID ,T2.ITM_ID ,T1.ORD_DT ,T3.ITM_ID ,T3.EVL_PT
FROM T_ORD T1
,T_ORD_DET T2
,T_ITM_EVL T3
WHERE T1.ORD_SEQ = T2.ORD_SEQ
AND T1.CUS_ID = 'CUS_0002'
AND T1.ORD_DT >= TO_DATE('20170122','YYYYMMDD')
AND T1.ORD_DT < TO_DATE('20170123','YYYYMMDD')
AND T3.CUS_ID(+) = T1.CUS_ID
AND T3.ITM_ID(+) = T2.ITM_ID;
์์ 9, 10 ๋ผ์ธ์ ๋ณด๋ฉด T3(์์ดํ ํ๊ฐ)๋ T1(์ฃผ๋ฌธ), T2(์ฃผ๋ฌธ์์ธ)์ ๋์์ Outer Join์ ํ๊ณ ์๋ค.
์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
"ORA-01417: a table may be outer joined to at most one other table Position: 310"
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์์๋ณด์.
์ฒซ ๋ฒ์งธ๋ ์ธ๋ผ์ธ-๋ทฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์์2. ์ธ๋ผ์ธ-๋ทฐ๋ฅผ ์ฌ์ฉํด ๋ถ๊ฐ๋ฅํ Outer Join ํด๊ฒฐ
SELECT T1.cus_id, T1.itm_id, T1.ord_dt, T2.itm_id, T2.evl_pt
FROM (SELECT ord.cus_id, det.itm_id, ord.ord_dt
FROM t_ord ord,
t_ord_det det
WHERE ord.ord_seq = det.ord_seq
AND ord.cus_id = 'CUS_0002'
AND ord.ord_dt >= to_date('20170122', 'yyyymmdd')
AND ord.ord_dt < to_date('20170123', 'yyyymmdd')) T1,
t_itm_evl T2
WHERE T2.cus_id(+) = T1.cus_id
AND T2.itm_id(+) = T1.itm_id
ORDER BY 1,2;
๋ ๋ฒ์งธ๋ ANSI ํ์ค SQL์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์์3. ANSI ๊ตฌ๋ฌธ์ ์ฌ์ฉํด ๋ถ๊ฐ๋ฅํ Outer Join ํด๊ฒฐ
SELECT ord.cus_id, det.itm_id, ord.ord_dt, evl.itm_id, evl.evl_pt
FROM t_ord ord
JOIN t_ord_det det
ON ord.ord_seq = det.ord_seq
LEFT JOIN t_itm_evl evl
ON ord.cus_id = evl.cus_id
AND det.itm_id = evl.itm_id
WHERE ord.cus_id = 'CUS_0002'
AND ord.ord_dt >= to_date('20170122', 'yyyymmdd')
AND ord.ord_dt < to_date('20170123', 'yyyymmdd')
ORDER BY 1,2;
๋จ, Oracle์์ ANSI ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ ์ํ ํํธ๊ฐ ์ ์ ๋จน๋ ๊ฒฝ์ฐ๊ฐ ์๋ค๋ ๊ฒ์ ์ฐธ๊ณ ํ์.
3-2-4. OUTER JOIN์ด ํฌํจ๋ ์ฌ๋ฌ ํ ์ด๋ธ์ ์กฐ์ธ
ํ๋์ SQL์์ Outer Join๊ณผ Inner Join์ ๋์์ ์ฌ์ฉํ ๋ ์ฃผ์ํ ์ ์ด ์๋ค.
์์๋ฅผ ํตํด ์ดํด๋ณด์.
์์1. Outer Join๊ณผ Inner Join์ ๋์์ ์ฌ์ฉํ๋ SQL
SELECT T1.CUS_ID ,T2.ORD_SEQ ,T2.ORD_DT ,T3.ORD_SEQ ,T3.ITM_ID
FROM M_CUS T1
,T_ORD T2
,T_ORD_DET T3
WHERE T1.CUS_ID = 'CUS_0073'
AND T1.CUS_ID = T2.CUS_ID(+)
AND T2.ORD_DT(+) >= TO_DATE('20170122','YYYYMMDD')
AND T2.ORD_DT(+) < TO_DATE('20170123','YYYYMMDD')
AND T3.ORD_SEQ = T2.ORD_SEQ;
์ ์ฟผ๋ฆฌ๋ฅผ ์ํํ๋ฉด ์กฐํ๋๋ ๋ฐ์ดํฐ๊ฐ ์๋ค.
๊ทธ ์ด์ ๋ ๋ฌด์์ผ๊น?
์ฟผ๋ฆฌ ์ํ ๊ณผ์ ์ ์ฐจ๋ก๋๋ก ์ดํด๋ณด์.
๋จผ์ T1(๊ณ ๊ฐ)๊ณผ T2(์ฃผ๋ฌธ)๊ฐ Outer Join์ ํ๊ณ ์๋ค.
SELECT T1.CUS_ID ,T2.ORD_SEQ ,T2.ORD_DT
-- ,T3.ORD_SEQ ,T3.ITM_ID
FROM M_CUS T1
,T_ORD T2
-- ,T_ORD_DET T3
WHERE T1.CUS_ID = 'CUS_0073'
AND T1.CUS_ID = T2.CUS_ID(+)
AND T2.ORD_DT(+) >= TO_DATE('20170122','YYYYMMDD')
AND T2.ORD_DT(+) < TO_DATE('20170123','YYYYMMDD')
-- AND T3.ORD_SEQ = T2.ORD_SEQ;
T2(์ฃผ๋ฌธ) ๋ฐ์ดํฐ ์งํฉ์๋ ๊ณ ๊ฐ 'CUS_0073'์ ์ ๋ณด๊ฐ ์๊ธฐ ๋๋ฌธ์ Outer Join์ ์ฐธ์กฐ ๋ฐ์ดํฐ ์งํฉ์ชฝ ๊ฒฐ๊ณผ๋ NULL์ด ๋๋ค.
๋ค์ ์๋ ์ฟผ๋ฆฌ๋ฅผ ์ดํด๋ณด๋ฉด 9๋ฒ ๋ผ์ธ์์ T2(์ฃผ๋ฌธ)๊ณผ T3(์ฃผ๋ฌธ์์ธ)๊ฐ ORD_SEQ ์ปฌ๋ผ์ผ๋ก Inner Join์ ์ํํ๊ณ ์๋ค.
๊ทธ๋ฐ๋ฐ T1๊ณผ Outer Join ์ํ ํ T2์ ORD_SEQ๋ NULL๊ฐ์ ๊ฐ์ง๋ค.
NULL๊ฐ์ ๋น๊ต๋ฅผ ํ ์ ์๋ค.
๋ฐ๋ผ์ ๊ฒฐ๊ณผ์ ์ผ๋ก ์กฐํ๋๋ ๋ฐ์ดํฐ๊ฐ ์๊ฒ ๋๋ค.
์กฐ์ธ ๊ฒฐ๊ณผ๊ฐ ๋์ค๊ฒ ํ๋ ค๋ฉด T3๋ T2์ Outer Join์ ๊ฑธ์ด์ค์ผ ํ๋ค.
SELECT T1.CUS_ID ,T2.ORD_SEQ ,T2.ORD_DT ,T3.ORD_SEQ ,T3.ITM_ID
FROM M_CUS T1
,T_ORD T2
,T_ORD_DET T3
WHERE T1.CUS_ID = 'CUS_0073'
AND T1.CUS_ID = T2.CUS_ID(+)
AND T2.ORD_DT(+) >= TO_DATE('20170122','YYYYMMDD')
AND T2.ORD_DT(+) < TO_DATE('20170123','YYYYMMDD')
AND T3.ORD_SEQ(+) = T2.ORD_SEQ;
(ANSI ํ์ด)
SELECT cus.cus_id, ord.ord_seq, ord.ord_dt, det.ord_seq, det.itm_id
FROM m_cus cus
LEFT JOIN t_ord ord
ON cus.cus_id = ord.cus_id
AND ord.ord_dt >= to_date('20170122', 'yyyymmdd')
AND ord.ord_dt < to_date('20170123', 'yyyymmdd')
LEFT JOIN t_ord_det det
ON ord.ord_seq = det.ord_seq
WHERE cus.cus_id = 'CUS_0073';
์ ๋ด์ฉ์ ์ ๋ฆฌํ๋ฉด, ์ฌ๋ฌ ํ ์ด๋ธ์ด ์กฐ์ธ๋ ๋ Outer Join์ด ์ํ๋ ์ฐธ์กฐ ๋ฐ์ดํฐ ์งํฉ์ ๊ธฐ์ค ์งํฉ์ด ๋์ด์ ๋ค๋ฅธ ํ ์ด๋ธ๊ณผ Outer Joinํด์ผ ํ๋ค.
3-2-5. OUTER JOIN์ ์์ฉ
Outer Join์ ์กฐ์ธ์ ์ฑ๊ณตํ์ง ๋ชปํด๋ ๊ธฐ์ค ๋ฐ์ดํฐ ์งํฉ์ ๋ฌด์กฐ๊ฑด ์กฐํ๋๋ ํน์ง์ด ์๋ค.
์ด์ ๊ฐ์ ํน์ง์ ๋ถ์ ๋ฆฌํฌํธ์์ ์ค์ ์ด ์๋ ๋ง์คํฐ๋ ๊ฒฐ๊ณผ์ ํฌํจ์ํฌ ๋ ์ ์ฉํ๋ค.
์์1. ๊ณ ๊ฐ๋ณ 1์์ ์ฃผ๋ฌธ ๊ฑด์๋ฅผ ๊ตฌํ๋ SQL (์ฃผ๋ฌธ์ด ์๋ ๊ณ ๊ฐ์ ์ฃผ๋ฌธ ๊ฑด์๊ฐ 0์ผ๋ก ์กฐํ๋์ด์ผ ํ๋ค.)
SELECT cus.cus_id, count(*) AS cnt, count(ord.ord_seq) AS ord_cnt
FROM m_cus cus
LEFT JOIN t_ord ord
ON cus.cus_id = ord.cus_id
AND ord.ord_dt >= to_date('20170101', 'yyyymmdd')
AND ord.ord_dt < to_date('20170201', 'yyyymmdd')
GROUP BY cus.cus_id
ORDER BY 1;
์ฃผ๋ฌธ ๊ฑด์๋ฅผ ๊ตฌํ๊ธฐ ์ํด COUNT() ์ง๊ณ ํจ์๋ฅผ ์ฌ์ฉํ๋๋ฐ, ๋ ๋ฒ์งธ ์ปฌ๋ผ์ COUNT(*)์ ์ํํ๊ณ , ์ธ ๋ฒ์งธ ์ปฌ๋ผ์ COUNT(ord.ord_seq)๋ฅผ ์ํํ๋ค.
๊ณ ๊ฐ 'CUS_0001'์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด, COUNT(*)์ ๊ฒฐ๊ณผ๋ 1๊ฑด์ด๊ณ , COUNT(ord.ord_seq)์ ๊ฒฐ๊ณผ๋ 0๊ฑด์ด๋ค.
์ด ์ค์ ํ์ํ ๊ฒฐ๊ณผ๋ COUNT(ord.ord_seq)์ ์ฌ์ฉํ ๊ฒฐ๊ณผ๋ค.
์๋ํ๋ฉด ๊ณ ๊ฐ 'CUS_0001'์ 1์์ ์ฃผ๋ฌธ์ด ํ๋๋ ์๋ ๊ณ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ด์ฒ๋ผ Outer Join๊ณผ COUNT() ์ง๊ณ ํจ์๋ฅผ ๋์์ ์ฌ์ฉํ ๋์๋ ํญ์ ์ฃผ์๊ฐ ํ์ํ๋ค.
COUNT() ๋์์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ด๋ค.
COUNT() ๋์์ด ์ค์ ์ ๊ฑด์๋ผ๋ฉด ์์ COUNT(ord.ord_seq)์ ๊ฐ์ด ์ฐธ์กฐ ํ ์ด๋ธ์ ์ปฌ๋ผ์ ์ฌ์ฉํด์ผ ํ๋ค.
COUNT() ๋์์ด NULL๊ฐ์ ํฌํจํ ์กฐ์ธ ๊ฒฐ๊ณผ ์์ฒด์ ๊ฑด์๋ผ๋ฉด COUNT(*)์ ์ฌ์ฉํด์ผ ํ๋ค.
์์2. 'PC, ELEC' ์์ดํ ์ ํ์ ์์ดํ ๋ณ 1์์ ์ฃผ๋ฌธ ์๋ ๊ตฌํ๊ธฐ (์ฃผ๋ฌธ์ด ์์ด๋ 0์ผ๋ก ๋์์ผ ํ๋ค.)
SELECT T1.ITM_ID, T1.ITM_NM, NVL(T2.ORD_QTY,0) AS ORD_QTY
FROM M_ITM T1
, (SELECT B.ITM_ID, SUM(ORD_QTY) AS ORD_QTY
FROM T_ORD A,
T_ORD_DET B
WHERE A.ORD_SEQ = B.ORD_SEQ
AND A.ORD_ST = 'COMP' -- ์ฃผ๋ฌธ์ํ=์๋ฃ
AND A.ORD_DT >= TO_DATE('20170101', 'yyyymmdd')
AND A.ORD_DT < TO_DATE('20170201', 'yyyymmdd')
GROUP BY B.ITM_ID) T2
WHERE T1.ITM_ID = T2.ITM_ID(+)
AND T1.ITM_TP IN ('PC', 'ELEC')
ORDER BY 1;
์ธ๋ผ์ธ-๋ทฐ๋ฅผ ์ฌ์ฉํด ์ค์ ๋ฐ์ดํฐ๋ฅผ M_ITM ํ ์ด๋ธ์ PK ๋จ์์ธ ITM_ID๋ก Group Byํ ํ์ ์กฐ์ธํ๊ณ ์๋ค.
์ด์ ๊ฐ์ด SQL์ ์์ฑํ๋ฉด ๊ฐ๋ ์ฑ์ด ์ข์์ง๊ณ , ๊ฒฐ๊ณผ์ ์ผ๋ก ์ ์ง ๋ณด์์๋ ๋์์ด ๋๋ค.
'๐พ ๋ฐ์ดํฐ๋ฒ ์ด์ค > SQL BOOSTER' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SQL BOOSTER] 6-1. INDEX์ ๊ธฐ๋ณธ ๊ฐ๋ (0) | 2024.06.08 |
---|---|
[SQL BOOSTER] 5-2. ์ฑ๋ฅ ๊ฐ์ ์ ์ํ ์ต์ํ์ ์ง์ (0) | 2024.03.22 |
[SQL BOOSTER] 5-1. ์คํ๊ณํ (0) | 2024.03.19 |
[SQL BOOSTER] 3-1. INNER JOIN (0) | 2024.03.19 |
[SQL BOOSTER] 1. ์ค๋นํ๊ธฐ - Mac OS์ ์ค๋ผํด DB ์ค์น(Docker), DataGrip ์ค์น (0) | 2024.02.18 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Claire's Study Note
Hi.Claire