[Oracle] ๊ณ์ธตํ ์ฟผ๋ฆฌ(START WITH.. CONNECT BY~)
์ถ์ฒ : https://docu94.tistory.com/70
https://coding-factory.tistory.com/461
SELECT [์ปฌ๋ผ]...
FROM [ํ
์ด๋ธ]
WHERE [์กฐ๊ฑด]
START WITH [์ต์์ ์กฐ๊ฑด]
CONNECT BY [NOCYCLE][PRIOR ๊ณ์ธตํ ๊ตฌ์กฐ ์กฐ๊ฑด];
๊ณ์ธตํ ๊ตฌ์กฐ๋ ์ํ ์์ง๊ด๊ณ์ ํธ๋ฆฌํํ์ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ง ํํ๋ฅผ ๋งํ๋ค.
์๋ฅผ ๋ค๋ฉด ํน์ ํ์ฌ์ ๋ถ์, ํน์ ํ๊ต์ ํ๊ณผ ๋ฑ์ด ์๋ค.
๊ณ์ธตํ ์ฟผ๋ฆฌ๋ ํ ์ด๋ธ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ธตํ ๊ตฌ์กฐ๋ก ๋ฐํํ๋ ์ฟผ๋ฆฌ๋ฅผ ๋งํ๋ค.
START WITH์ ์ ๋ฃจํธ๋ ธํธ(ํ)์ ๋ช ์ํ๋ค.
EMP ํ ์ด๋ธ์ ํ์ธํด๋ณด๋ฉด ํด๋น ์ฌ์์ ๊ด๋ฆฌ์๊ฐ ์๋ค.
๊ทธ ๊ด๋ฆฌ์๊ฐ ์ต์ข ๊ด๋ฆฌ์์ผ ์ ์์ง๋ง ๊ทธ ๊ด๋ฆฌ์๋ ๋ ์์์ ๊ด๋ฆฌ์๊ฐ ์์ ์๋ ์๋ค.
ํ์ง๋ง ๊ฒฐ๊ตญ์ ๋ง์ง๋ง ์ต์ข ๊ด๋ฆฌ์๊ฐ ์์ ๊ฒ์ด๊ณ ๊ทธ ์ต์ข ๊ด๋ฆฌ์๋ ๋ ์ด์ ์์ ์ ๊ด๋ฆฌ์๋ ์๊ธฐ์ ๊ด๋ฆฌ์ ์ปฌ๋ผ์ NULL์ผ ๊ฒ์ด๋ค.
START WITH
๊ทธ๋์ ์์์ ์ต์ข ๊ด๋ฆฌ์๋ถํฐ ํด์ผ ํ๊ธฐ์
START WITH์์ ๊ด๋ฆฌ์ ์ปฌ๋ผ์ด NULL์ธ ๋ถ๋ถ์ ์กฐ๊ฑด์์ผ๋ก ๋ฃ๊ฒ ๋๋ค.
EMP์์ ๊ด๋ฆฌ์ ์ปฌ๋ผ MGR์ ๋ณด๋ฉด ENAME = 'KING'์ด NULL๋ก ๋์ด์๋ค. ์ต์ข ๊ด๋ฆฌ์๋ผ๋ ์๋ฏธ์ด๋ค.
CONNECT BY
CONNECT BY๋ ์ฐ๊ฒฐ ๊ณ ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ๋ชฉ๋ก์ ๊ฐ์ ธ์จ๋ค.
๋จผ์ START WITH์์ ์กฐ๊ฑด์ ๋ง๋ ์ต์์ ํ์ ๊ฐ์ ธ์จ๋ค.
๋ค์์ผ๋ก ์ต์์ ํ์ ๊ด๋ฆฌ์๋ก ๊ฐ๋ ๋ค์ ๊ณ์ธต ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ค.
๊ทธ๋ผ ํ์ฌ ์ฐพ์์จ ์ทจ์์ ๊ด๋ฆฌ์์ EMPID๋ฅผ ์ถ์ถํด์ ๋ค์ ํ์ ๊ตฌํด์ผ ํ๋ค.
๊ทธ ์ต์์ EMPID๋ฅผ MGR๋ก ๊ฐ๋ ํ๋ค์ ์ฐพ์์ผ ํ๋ค.
CONNECT BY PRIOR EMPID = MGR
์ฐ๊ฒฐํ๋ ๋ฐฉ์์ ๋ฏธ๋ฆฌ ๊ตฌํ ์ ํ์ EMPID์ ๊ตฌํด์ผ ํ MGR์ด ๊ฐ์ ํ๋ค์ ๊ตฌํ๋ค.
๊ทธ๋ผ ์ด์ START WITH์์ ๊ตฌํ ์ต์์ ํ๊ณผ ๊ทธ ํ์ EMPID๋ฅผ MGR๋ก ๊ฐ๋ ํ๋ค์ ๊ฐ๊ฒ ๋์๋ค.
์ด์ ๋ค์ ์์ ์ ์ต์์ ํ์ผ๋ก ๊ตฌํ ๋ ๋ฒ์งธ ๊ณ์ธต์ ํ๋ค์ ๊ฐ์ง๊ณ ๊ทธ ๊ณ์ธต๋ค์ EMPID๋ฅผ MGR๋ก ๊ฐ๋ ๋ค์ ๊ณ์ธต์ ํ๋ค์ ๊ตฌํ๋ค.
๊ทธ๋ ๊ฒ ์ญ~ ๊ธ๊น์ง ๊ตฌํ๋ฉด ๋๋ค.
์ ๋ฆฌํ์๋ฉด,
์ฐ๊ฒฐ ๋ฐฉ์์ ๋ฐ๋ก ์ ์(PRIOR) ๊ตฌํ ๊ณ์ธต์ EMPID๋ฅผ MGR๋ก ๊ฐ๋ ๋ฐ์ดํฐ๋ฅผ ๊ตฌํ๋ค.
CONNECT BY EMPID = PRIOR MGR
๋ง์ฝ PRIOR๋ฅผ ๋ฐ๋๋ก ์ค์ ํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
์ฐ๊ฒฐ ๋ฐฉ์์ ๋ฐ๋ก ์ ์(PRIOR) ๊ตฌํ ๊ณ์ธต์ MGR์ EMPID๋ก ๊ฐ๋ ๋ฐ์ดํฐ๋ฅผ ๊ตฌํ๋ค.
START WITH๋ก ๋จผ์ ์ต์์ ํ์ ๊ตฌํ๋๋ฐ..
๊ทธ ๋ค์ ๊ตฌํ ๊ณ์ธต์ ์ต์์ ํ์ MGR(์ต์์๋ NULL)์ EMPID๋ก ๊ฐ๋ ๊ฐ์ ์๋ค.. NULL์ด๋๊น
LEVEL
๊ณ์ธตํ ์ฟผ๋ฆฌ๋ฅผ ์กฐํํ๋ฉด ํ์ฌ ํ์ด ๊ณ์ธต์ ๋ช ๋ฒ์งธ ๋ ๋ฒจ์ธ์ง ํ์ํด ์ค๋ค.
๊ณ์ธตํ ์ฟผ๋ฆฌ์์๋ง ์ฌ์ฉํ๋ ๋ชจ์กฐ ์ปฌ๋ผ์ด๋ค. ์ค์ ํ ์ด๋ธ์ ์๋ ์ปฌ๋ผ์ ์๋์ง๋ง SELECT ๋ฌธ์์ ์ฌ์ฉํ ์ ์๋ ์ปฌ๋ผ์ด๋ค.
์ต์์ธต ๋ ๋ฒจ์ 1๋ก ํด์ ์ญ- 2,3,4๋ก ๋์จ๋ค.
๊ฐ์ฅ ๋ง์ด ์์ฉํ๋ ๋ฐฉ๋ฒ์ด ๋ ๋ฒจ๋ณ๋ก ๋ค์ฌ์ฐ๊ธฐ๋ฅผ ํ์ฌ ์ข ๋ ์ง๊ด์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํํํ๋ ๊ฒ์ด๋ค.
๋ ๋ฒจ์์ฌ์ปฌ๋ผ ํ์ฉ ๋ ๋ฒจ๋ณ๋ก ๋ค์ฌ์ฐ๊ธฐ
SELECT
LPAD(' ', 2*(LEVEL-1)) || DEPT_NAME AS DEPT_NAME, --๋ ๋ฒจ๋ณ ๋ค์ฌ์ฐ๊ธฐ
DEP_CD,
PARENT_CD ,
LEVEL
FROM DEP
START WITH PARENT_CD IS NULL --์ต ์์๋
ธ๋ ์ค์ ,
CONNECT BY PRIOR DEP_CD = PARENT_CD;--๋ถ๋ชจ๋
ธ๋์ ์์๋
ธ๋ ์ฐ๊ฒฐ
๋ ๋ฒจ-1 * ๊ณต๋ฐฑ(2)๋ฅผ ์์ ์ฝ์ ํ์ฌ ์ข ๋ ๊ณ์ธตํ ๋ฐ์ดํฐ๋ฅผ ์ง๊ด์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์๋ค.
ORDER BIBLINGS BY
order by๋ก sortํ ๊ฒฝ์ฐ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์ ๋ ฌ์ ํ์ง๋ง order siblings by ๋ ๊ฐ ๊ณ์ธต๋ณ๋ก ์ ๋ ฌ์ ํ๋ค.
๊ทธ๋ฅ ์ ๋ ฌํ๋ฉด ๊ณ์ธต๊ตฌ์กฐ๊ฐ ํํธ๋ฌ์ง๊ธฐ ๋๋ฌธ์ ๊ณ์ธต๊ตฌ์กฐ๋ ๊ทธ๋๋ก ์ ์งํ๋ฉด์ ๋์ผ ๋ถ๋ชจ๋ฅผ ๊ฐ์ง ์์๋ค๋ผ๋ฆฌ์ ์ ๋ ฌ ๊ธฐ์ค์ ๋๋ ๊ฒ์ด๋ค.
์
START WITH a.parent_id = '0'
CONNECT BY PRIOR a.menu_id = a.parent_id
ORDER SIBLINGS BY a.sort asc
๋ถ๋ชจ์ปฌ๋ผ์ธ parent_id๋ก ์ ๋ ฌํ๊ณ ๊ทธ ๋ค์ ๋์ผ ๋ถ๋ชจ์ธ ์์๋ค(sort)๋ก ์ ๋ ฌ์ด ๋๋ค.