Database/SQL

[Oracle] ๊ณ„์ธตํ˜• ์ฟผ๋ฆฌ(START WITH.. CONNECT BY~)

์ฑ”๐Ÿป 2022. 1. 17. 16:46

์ถœ์ฒ˜ : https://docu94.tistory.com/70

https://coding-factory.tistory.com/461

https://tiboy.tistory.com/563

 

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)๋กœ ์ •๋ ฌ์ด ๋œ๋‹ค.