๐ ๊ณ์ธตํ ์ง์ (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 |
---|