Computer Language/SQL

[SQL] Oracle ๊ณ„์ธตํ˜• ์งˆ์˜ (START WITH, CONNECT BY, ORDER SIBLINGS BY, SYS_CONNECT_BY_PATH)

๊ฝ์น˜_๋กœ๊ทธ 2024. 8. 22. 16:42

๐Ÿš€ ๊ณ„์ธตํ˜• ์งˆ์˜ (START WITH, CONNECT BY)

๊ณ„์ธตํ˜• ์งˆ์˜๋ฅผ ์ด์šฉํ•ด EMP ํ…Œ์ด๋ธ”์—์„œ ์‚ฌ์›๊ฐ„์˜ ์„œ์—ด์„ ์ถœ๋ ฅํ•œ๋‹ค.

START WITH์™€ CONNECT BY ์ ˆ์„ ์ด์šฉํ•˜๋ฉด LEVEL์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

  • START WITH ์ ˆ์€ ๋ฃจํŠธ๋…ธ๋“œ๋ฅผ ์ง€์ •
  • CONNECT BY ์ ˆ์€ ๋ถ€๋ชจ๋…ธ๋“œ์™€ ์ž์‹๋…ธ๋“œ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ง€์ •

์šฐ์„  EMP ํ…Œ์ด๋ธ”์˜ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์œ„์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„๋•Œ EMPNO์™€ MGR๋ฅผ ๋ณด๋ฉด ์ƒํ•˜๊ด€๊ณ„๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. MGR๊ฐ€ ์ƒ์œ„์ด๋‹ค. ์ƒํ•˜๊ด€๊ณ„๋ฅผ ๊ฐ„๋‹จํžˆ ๋‚˜ํƒ€๋‚ด๋ฉด ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค.

ํ•˜๋‚˜ ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด KING์€ ๋ฃจํŠธ์ด๊ณ  BLAKE, CLARK, JONES์˜ ๊ฒฝ์šฐ KING์˜ ํ•˜์œ„ ๊ด€๊ณ„๋‹ค. JONES๋ฅผ ๋ณด๋ฉด SCOTT๊ณผ FORD๊ฐ€ ํ•˜์œ„ ๊ด€๊ณ„์ด๋ฉฐ FORD๋ฅผ ๋ณด๋ฉด SMITH๊ฐ€ ํ•˜์œ„ ๊ด€๊ณ„์ธ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. (๋นจ๊ฐ„์ƒ‰ ์ค„์€ ์ž˜๋ชป ํ‘œํ˜„๋˜์—ˆ๋‹ค. SMITH์˜ ๊ฒฝ์šฐ FORD๋ฅผ ๊ฐ€๋ฆฌ์ผœ์•ผํ•œ๋‹ค)

์ด์ฒ˜๋Ÿผ ์ƒํ•˜๊ด€๊ณ„, ๊ณ„์ธตํ˜•์„ ๊ฐ„๋‹จํžˆ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด ๊ณ„์ธตํ˜• ์งˆ์˜์ด๋‹ค.

1
2
3
4
5
6
7
SELECT rpad(' ', (level-1)*3|| ename as employee
     , level
     , sal
     , job
FROM EMP
START WITH ename='KING'
CONNECT BY PRIOR empno = mgr;
cs

์œ„ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋Š” ์œ„์—์„œ ๋ดค๋˜ ๊ณ„์ธตํ˜• ๊ทธ๋ฆผ์ด๋‹ค. ์ฟผ๋ฆฌ๋ฅผ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด

  • SATRT WITH ename = 'KING'  : KING์„ ๋ฃจํŠธ ๋…ธ๋“œ๋กœ ์„ค์ •ํ•œ๋‹ค.
  • CONNECT BY PRIOR empno = mgr : empno(๋ถ€๋ชจ๋…ธ๋“œ)์™€ mgr(์ž์‹๋…ธ๋“œ) ๊ด€๊ณ„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ƒํ•˜๊ด€๊ณ„๋ฅผ ๋งŒ๋“ ๋‹ค.
  • LEVEL : ์ƒํ•˜๊ด€๊ณ„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ ˆ๋ฒจ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ค€๋‹ค.
  • RPAD :  LEVEL์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ์œผ๋กœ๋ถ€ํ„ฐ ๊ณต๋ฐฑ์„ ์ƒ์„ฑํ•˜์—ฌ ๊ณ„์ธตํ˜•์„ ๊ฐ€์‹œํ™”ํ•œ๋‹ค.

 

๐Ÿš€ ์ •๋ ฌ (ORDER SIBLINGS BY, ORDER BY)

ORDER SIBLINGS BY๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ฃจํŠธ๋…ธ๋“œ์™€ ์ž์‹๋…ธ๋“œ ๊ฐ„์˜ ์„œ์—ด์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ •๋ ฌ์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT rpad(' ', (level-1)*3|| ename as employee
     , level
     , sal
     , job
FROM EMP
START WITH ename='JONES'
CONNECT BY PRIOR empno = mgr
ORDER SIBLINGS BY sal ASC;
 
SELECT rpad(' ', (level-1)*3|| ename as employee
     , level
     , sal
     , job
FROM EMP
START WITH ename='JONES'
CONNECT BY PRIOR empno = mgr
ORDER SIBLINGS BY sal DESC;    
cs

๋ฐ˜๋ฉด, ORDER BY ์ ˆ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ๋˜๋ฉด ๋ฃจํŠธ๋…ธ๋“œ์™€ ์ž์‹๋…ธ๋“œ๊ฐ„์˜ ์„œ์—ด์„ ๋ฌด์‹œํ•˜๊ณ  ์ •๋ ฌ์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT rpad(' ', (level-1)*3|| ename as employee
     , level
     , sal
     , job
FROM EMP
START WITH ename='JONES'
CONNECT BY PRIOR empno = mgr
ORDER BY sal ASC;
 
SELECT rpad(' ', (level-1)*3|| ename as employee
     , level
     , sal
     , job
FROM EMP
START WITH ename='JONES'
CONNECT BY PRIOR empno = mgr
ORDER BY sal DESC;
cs

๐Ÿš€ ๊ฒฝ๋กœ ํ‘œ์‹œ ( SYS_CONNECT_BY_PATH )

SYS_CONNECT_BY_PATH๋ฅผ ์ด์šฉํ•˜๋ฉด CONNECT BY๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜จ ๊ฐ’์„ ๋งˆ์น˜ ๋ฃจํŠธ๋…ธ๋“œ๋กœ ๋ถ€ํ„ฐ ๊ฒฝ๋กœ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ํ‘œํ˜„ํ•œ๋‹ค.

* LTRIM์„ ์ด์šฉํ•ด ์•ž์— ์ถœ๋ ฅ๋˜๋Š” '/'๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

1
2
3
4
5
SELECT ename
     , LTRIM(SYS_CONNECT_BY_PATH(ename, '/'), '/') as PATH
FROM EMP
START WITH ename='KING'
CONNECT BY PRIOR empno = mgr;
cs

์ด์ „ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ํ™œ์šฉํ•˜๋ฉด ๋…ธ๋“œ๊ฐ„์˜ ๊ณ„์ธต๋„๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

1
2
3
4
5
SELECT ename
     , RPAD(' ', (level-1)*3|| LTRIM(SYS_CONNECT_BY_PATH(ename, '/'), '/') as PATH
FROM EMP
START WITH ename='KING'
CONNECT BY PRIOR empno = mgr;
cs

 

๐Ÿš€ ์ฃผ์˜!

START WITH 

๋ฃจํŠธ๋…ธ๋“œ๋ฅผ ์ง€์ •ํ•ด์ค€๋‹ค. ๊ฐ™์€ ์ฟผ๋ฆฌ๋ผ๋„ ๋ฃจํŠธ๋…ธ๋“œ๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์— ๋”ฐ๋ผ ์ถœ๋ ฅ๊ฒฐ๊ณผ๋Š” ๋‹ฌ๋ผ์ง„๋‹ค.

KING์ด ์•„๋‹Œ JONES๋ฅผ ๋ฃจํŠธ๋…ธ๋“œ๋กœ ํ•˜๋ฉด JONES ํ•˜์œ„ ๋…ธ๋“œ๋“ค๋งŒ ์ถœ๋ ฅ๋œ๋‹ค.

1
2
3
4
5
6
7
SELECT rpad(' ', (level-1)*3|| ename as employee
     , level
     , sal
     , job
FROM EMP
START WITH ename='JONES'
CONNECT BY PRIOR empno = mgr;
cs

 

๋ฐ˜์‘ํ˜•

'Computer Language > SQL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[MSSQL] While ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•  (0) 2022.07.20