๊ณ์ธตํ ์ฟผ๋ฆฌ๋ ํ ์ด๋ธ์ ๊ณ์ธตํ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ์กฐํํ๊ธฐ ์ํ ์ฟผ๋ฆฌ์ด๋ค. SQL-D ์ํ ๊ณต๋ถ๋ฅผ ํ ๋, ์ ๋ง ์ฝ๋ ๊ฒ๋ง์ผ๋ก๋ ์ดํด๊ฐ ์๋์๋ ๋ถ๋ถ์ด ๊ณ์ธตํ ์ฟผ๋ฆฌ์๋ค. ๋ฐ๋ผ์ ๊ธ์ ์ฐ๋ฉด์ ๋ค์ ์ ๋ฆฌํด๋ณธ๋ค.
1. ๊ณ์ธตํ ๋ฐ์ดํฐ
๊ณ์ธตํ ๋ฐ์ดํฐ๋ ๋์ผ ํ
์ด๋ธ์ ๊ณ์ธต์ ์ผ๋ก ์์์ ํ์ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ๋ฐ์ดํฐ๋ฅผ ๋งํ๋ค.
์์๋ก ๋ค์ด๋ณผ ํ๋์จ์ด์ ๊ณ์ธต์ ๊ตฌ์กฐ์ด๋ค. ๋ค์๊ณผ ๊ฐ์ด ์์์ ํ์ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ธตํ ๋ฐ์ดํฐ๋ผ๊ณ ํ๋ค. ์๋ฅผ ๋ค์ด, ์ค์์ฒ๋ฆฌ์ฅ์น์ ๊ธฐ์ต์ฅ์น, ์
๋ ฅ์ฅ์น์ ์์ ๋ฐ์ดํฐ๋ ํ๋์จ์ด์ด๋ฉฐ, ํ๋์จ์ด์ ํ์ ๋ฐ์ดํฐ๋ ์์ ์ธ ๊ฐ์ด๋ค.
์ด๋ฅผ ํ ์ด๋ธ๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ ํํ๋ก ๋ํ๋ผ ์ ์๋ค.
2. ๊ณ์ธตํ ์ฟผ๋ฆฌ์ ํํ
1
2
3
|
START WITH ์กฐ๊ฑด
CONNECT BY [NOCYCLE] ์กฐ๊ฑด
[ORDER SIBLINGS BY ์ปฌ๋ผ];
|
๊ณ์ธตํ ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ํ์์ผ๋ก ์ฐ์ธ๋ค. [] ์์ ๋ด์ฉ์ ํ์์ ์ผ๋ก ๋ค์ด๊ฐ์ง ์์๋ ๋๋ ๋ด์ฉ์ด๋ค. ์ด ๊ตฌ๋ฌธ์ ๋ํด์ ์ค๋ช ์ ํด๋ณด์๋ฉด
START WITH ์ ์ ๊ทธ ์ด๋ฆ์์๋ ์ถ์ธกํ ์๋ ์๋ฏ์ด ๊ณ์ธต ๊ตฌ์กฐ ์ ๊ฐ์ ์์ ์์น๋ฅผ ์ง์ ํ๋ค. ์๋ฅผ ๋ค์ด ์ ํ
์ด๋ธ์์ START WITH ์์์ฅ์น IS NULL์ ํ๋ฉด 1ํ์ ์์์์น๋ก ์ง์ ํ๋ ๊ฒ์ด๋ค.
CONNECT BY ์ ์ ๋ค์์ ์ ๊ฐ๋ ์์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ํ๋๋ฐ, PRIOR๋ฅผ ์ฃผ๋ก ์ฌ์ฉํด์ ์ง์ ํ๋ค. ์ด๋ PRIOR ์์ = ๋ถ๋ชจ ํํ๋ฅผ ์ธ ๊ฒฝ์ฐ ์๋ฐฉํฅ ์ ๊ฐ, PRIOR ๋ถ๋ชจ = ์์ ํํ๋ฅผ ์ธ ๊ฒฝ์ฐ ์ญ๋ฐฉํฅ ์ ๊ฐ๋ฅผ ํ๋ค. ์ ํ
์ด๋ธ์ ์๋ก ๋ค์๋ฉด PRIOR ์ฅ์น์ด๋ฆ = ์์์ฅ์น์ ๊ฒฝ์ฐ ์๋ฐฉํฅ ์ ๊ฐ, PRIOR ์์์ฅ์น = ์ฅ์น์ด๋ฆ์ ๊ฒฝ์ฐ ์ญ๋ฐฉํฅ ์ ๊ฐ์ด๋ค.
CONNECT BY ์ ์์ []์น NOCYCLE์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฐํ๋ฉด์ ์ด๋ฏธ ๋ํ๋ ๋ฐ์ดํฐ๊ฐ ๋ ๋ํ๋ ๊ฒ์ ๋ฐฉ์งํด์ค๋ค.
ORDER SIBLINGS BY ์ ์ ํ์ ๋
ธ๋(๋์ผ LEVEL) ์ฌ์ด์์ ์ ๋ ฌ์ ์ํํด์ค๋ค.
3. ๊ณ์ธตํ ์ฟผ๋ฆฌ์ ์์
์์ ์ค๋ช ๋ง์ผ๋ก๋ ์ด๊ฒ ๋ญ์๋ฆฐ๊ฐ…? ํ๋ ์๊ฐ์ด ๋ค ๊ฒ์ด๋ค. ์ง์ ํ ์ด๋ธ์ ๋ง๋ค๊ณ ๊ณ์ธตํ ์ฟผ๋ฆฌ๋ฅผ ์จ๋ณด๋ฉฐ ์ดํด๋ฅผ ํด๋ณด์.
1
2
3
4
5
6
7
8
9
10
11
12
|
CREATE TABLE TAB1 (
์ฅ์น์ด๋ฆ VARCHAR2(20),
์์์ฅ์น VARCHAR2(20) );
INSERT INTO TAB1 VALUES ('ํ๋์จ์ด', NULL);
INSERT INTO TAB1 VALUES ('์ค์์ฒ๋ฆฌ์ฅ์น', 'ํ๋์จ์ด');
INSERT INTO TAB1 VALUES ('๊ธฐ์ต์ฅ์น', 'ํ๋์จ์ด');
INSERT INTO TAB1 VALUES ('์
์ถ๋ ฅ์ฅ์น', 'ํ๋์จ์ด');
INSERT INTO TAB1 VALUES ('์
๋ ฅ์ฅ์น', '์
์ถ๋ ฅ์ฅ์น');
INSERT INTO TAB1 VALUES ('์ถ๋ ฅ์ฅ์น', '์
์ถ๋ ฅ์ฅ์น');
SELECT * FROM TAB1;
|
์ปฌ๋ผ ์ด๋ฆ์ ๋ณด๊ธฐ ํธํ๋๋ก ๊ทธ๋ฅ ํ๊ธ์ด๋ฆ์ ์ฌ์ฉํ์๋ค. ์ด sql๋ฌธ์ ์คํํ๋ฉด ์์์ ๋ณด์๋ ํ ์ด๋ธ๊ณผ ๊ฐ์ ํํ๊ฐ ๋๋ค. ๋จผ์ ์๋ฐฉํฅ ์ ๊ฐ๋ฌธ์ ๋จผ์ ์คํ์์ผ๋ณด์.
1
2
3
|
SELECT ์ฅ์น์ด๋ฆ, ์์์ฅ์น, LEVEL FROM TAB1
START WITH ์์์ฅ์น IS NULL
CONNECT BY PRIOR ์ฅ์น์ด๋ฆ = ์์์ฅ์น;
|
๊ณ์ธตํ ์ฟผ๋ฆฌ๊ฐ ์ด๋ค ์์ผ๋ก ์ ๊ฐ๋๋์ง ๋ณด๊ธฐ ํธํ๋๋ก LEVEL์ด๋ผ๋ ๊ฐ์ ์ปฌ๋ผ์ ์ฌ์ฉํ์๋ค. LEVEL์ ๋ฃจํธ ๋ฐ์ดํฐ๋ 1, ๊ทธ ํ์ ๋ฐ์ดํฐ๋ 2, ๊ทธ ํ์ ๋ฐ์ดํฐ์ ํ์ ๋ฐ์ดํฐ๋ 3… ์ด๋ฐ์์ผ๋ก ๋ฆฌํ ๋ฐ์ดํฐ๊น์ง 1์ฉ ์ฆ๊ฐํ๋ค. ์ดํด๊ฐ ๋์ง ์๋ ๋ค๋ฉด ์๋ ๊ทธ๋ฆผ์ ์ฐธ๊ณ ํ๋ ๊ฒ์ด ์ข์ ๊ฒ์ด๋ค.
์ SQL๋ฌธ์ ํ๋ํ๋ ์ดํด๋ณด์๋ฉด START WITH ์์์ฅ์น IS NULL์ ํตํด ํ๋์จ์ด๋ฅผ ๊ณ์ธตํ ์ ๊ฐ์ ์์์ ์ผ๋ก ์ฌ์ฉํ์๋ค. ์ด๋ ์์์ ์ ๋ฃจํธ ๋ฐ์ดํฐ๋ก LEVEL์ 1์ด๋ค. ์ด์ CONNECT BY PRIOR ์ฅ์น์ด๋ฆ = ์์์ฅ์น ๋ฅผ ํตํด ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฐํ๋ค.
๋ค์๊ณผ ๊ฐ์ด ์ด์ ๊ณ์ธต์ ์ฅ์น์ด๋ฆ(ํ๋์จ์ด)๋ฅผ ์์์ฅ์น๋ก ๊ฐ์ง๊ณ ์๋ ๊ธฐ์ต์ฅ์น, ์ ์ถ๋ ฅ์ฅ์น, ์ค์์ฒ๋ฆฌ์ฅ์น๋ LEVEL 2๊ฐ ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ด์ ๊ณ์ธต์ ์ฅ์น์ด๋ฆ(์ ์ถ๋ ฅ์ฅ์น)๋ฅผ ์์์ฅ์น๋ก ๊ฐ์ง๊ณ ์๋ ์ ๋ ฅ์ฅ์น, ์ถ๋ ฅ์ฅ์น๊ฐ LEVEL 3์ด ๋๋ค.
1
2
3
|
SELECT ์ฅ์น์ด๋ฆ, ์์์ฅ์น, LEVEL FROM TAB1
START WITH ์์์ฅ์น = '์
์ถ๋ ฅ์ฅ์น'
CONNECT BY PRIOR ์์์ฅ์น = ์ฅ์น์ด๋ฆ;
|
๋ฐ๋๋ก PRIOR ์์์ฅ์น = ์ฅ์น์ด๋ฆ์ ์จ์ ์ญ๋ฐฉํฅ ์ ๊ฐ๋ฅผ ํตํด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํด๋ผ ์๋ ์์ผ๋ฉฐ
1
2
3
4
|
SELECT ์ฅ์น์ด๋ฆ, ์์์ฅ์น, LEVEL FROM TAB1
START WITH ์์์ฅ์น IS NULL
CONNECT BY PRIOR ์ฅ์น์ด๋ฆ = ์์์ฅ์น
ORDER SIBLINGS BY ์ฅ์น์ด๋ฆ DESC;
|
ORDER SIBLINGS BY ์ ์ ์ด์ฉํด ๊ฐ์ ๋ ๋ฒจ์ ๋ ธ๋ ๊ฐ์ ์ ๋ ฌ ์์๋ฅผ ์ ํด์ค ์๋ ์๋ค.