๋๋ผ๋ณ ๊ธ์ฌ ํ๊ท ์ ํ๊ท ๋ณด๋ค ๋ง์ด ๊ธ์ฌ๋ฅผ ์ฃผ๊ณ ์๋ ๋๋ผ์ ๋๋ผ์ ํ๊ท ๊ธ์ฌ๋ฅผ ๊ตฌํ์์ค. (๋๋ผ๋ช ๊ณผ ๋๋ผ์ ํ๊ท ๊ธ์ฌ๋ง ์ถ๋ ฅ)
์์ ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด ์ด๋ป๊ฒ ํด์ผํ ๊น์? ๋๋ผ๋ณ ํ๊ท ๊ธ์ฌ๋ฅผ ์กฐ์ธ๋ฌธ์ผ๋ก ์ด์ฉํด์ ๊ตฌํ๋ ์ฟผ๋ฆฌ๋ฅผ ์ฟผ๋ฆฌA๋ผ๊ณ ํ๊ฒ ์ต๋๋ค. ํ๊ท ์ ํ๊ท ๊ฐ์ ๊ตฌํ๊ธฐ ์ํด์๋ ์ฟผ๋ฆฌA๋ฅผ SUBQUERY๋ก ์ฌ์ฉํด์ ํ๊ท ์ ๊ตฌํ ์ ์์ต๋๋ค. ํ๊ท ์ ํ๊ท ๊ฐ๋ณด๋ค ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด์ ์ฟผ๋ฆฌA ๊ฒฐ๊ณผ์ PROJECTION์ด ํ์ํฉ๋๋ค.
์ ๊ณผ์ ์ ์๊ฐํด๋ดค์๋ ์ฟผ๋ฆฌA๋ ์ ์ฒด ์ฟผ๋ฆฌ์์ 2๋ฒ ์ฌ์ฉํด์ผํฉ๋๋ค. 2๋ฒ ์ฌ์ฉํ๊ฒ๋๋ฉด ํผํฌ๋จผ์ค๋ ๋ฎ์์ง๊ณ ์ฟผ๋ฆฌ์ ๊ฐ๋ ์ฑ๋ ๋จ์ด์ง๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ WITH์ ์ ์ฌ์ฉํด์ ์ฟผ๋ฆฌ๋ฌธ์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ค์ต์ Oracle HR ๊ณ์ ์ผ๋ก ์งํํ์ต๋๋ค.
WITH์ ์ฌ์ฉ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
WITH
COUNTRY_AVG AS (
SELECT
L.COUNTRY_ID
,ROUND(AVG(E.SALARY)) AS COUNTRY_SAL_AVG
FROM EMPLOYEES E, DEPARTMENTS D, LOCATIONS L
WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID
AND D.LOCATION_ID = L.LOCATION_ID
GROUP BY L.COUNTRY_ID
),
ALL_AVG AS (
SELECT
ROUND(AVG(COUNTRY_SAL_AVG)) AS COUNTRY_SAL_AVG
FROM COUNTRY_AVG
)
SELECT
COUNTRY_ID
,COUNTRY_SAL_AVG
FROM COUNTRY_AVG
WHERE COUNTRY_SAL_AVG > (
SELECT
COUNTRY_SAL_AVG
FROM ALL_AVG
);
|
WITH ์ ์ ํตํด์ COUNTRY_AVG์ ALL_AVG์ ์ฟผ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ์ ์ ํ์ต๋๋ค.
COUNTRY_AVG = ์ฟผ๋ฆฌA --> ๊ฐ ๋๋ผ๋ณ ํ๊ท ๊ธ์ฌ๋ฅผ ๊ตฌํ๋ ์ฟผ๋ฆฌ
ALL_AVG --> COUNTRY_AVG๋ฅผ ๋ค์ ํ์ฉํด์ ๋๋ผ๋ณ ๊ธ์ฌ ํ๊ท ์ ํ๊ท ๊ฐ์ ์ ์ํ์ต๋๋ค.
์ต์ข ์ ์ผ๋ก COUNTRY_AVG์์ ALL_AVG๊ฒฐ๊ณผ๋ณด๋ค ๋์ ๊ธ์ฌํ๊ท ์ ๊ฐ๊ณ ์๋ ๋๋ผ๋ค๋ง ์ถ๋ ฅํ์ต๋๋ค.
์ด๋ ๊ฒ ๋ฏธ๋ฆฌ ์ ์ํ ์ฟผ๋ฆฌ๋ฅผ ํ๋ฒ ์์ฑํ์ฌ 2๋ฒ์ด์ ์ฌ์ฉํ๊ฒ ๋๋ ๊ฒฝ์ฐ์์ ๊ฐ๋ ์ฑ์ ๋ํ ์ ์๊ณ ์ค์ ๋ก ์คํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ๊ณ ์์ด ํผํฌ๋จผ์ค๋ ๋์ฌ์ค๋๋ค.
RECURSIVE WITH ์ฌ๊ท ์ฟผ๋ฆฌ
์ฌ๋ฌ ํ๋ก๊ทธ๋จ ์ธ์ด๋ค์ ์ฌ๊ทํจ์์ ๊ฐ๋ ์ด ์์ต๋๋ค. ์์ ์ ํจ์๋ฅผ ํจ์๋ก์ง ์์์ ๋ค์ ๋ถ๋ฌ ์ฌ์ฉํ๋ ๊ธฐ์ ์ ๋๋ค. ์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํ ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํผ๋ณด๋์น ์์ด, ํฉํ ๋ฆฌ์ผ ๊ตฌํ, ์ฐ์๋ ์์ ํฉ์ด ์์ต๋๋ค.
์ฐ์๋ ์์ ํฉ
์ฐ์๋ ์์ ํฉ์ ๊ทธ๋ฆผ์ผ๋ก ํํํด๋ดค์ต๋๋ค. ์ธ์๋ก 1๊ณผ 9๊ฐ ๋ค์ด๊ฐ๋ฉด 1๋ถํฐ 9๊น์ง ๋ชจ๋ ์ซ์๋ฅผ ๋ํด์ 45๋ผ๋ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ฌ๊ทํจ์์์ผ๋ก ํํํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
์ด์ ์ ๊ฒฐ๊ณผ๋ฅผ ๊ณ์ํด์ ์ธ์๋ก ๊ฐ์ผ๋ก ๋ฃ์ด์ฃผ๊ณ ๋ ์ด์ ๋ฃ์ด์ค ์ธ์๊ฐ ์์ ๋ ๋๋จธ์ง ๋๋จธ์ง ์ฟผ๋ฆฌ๊ฐ ์งํ๋ฉ๋๋ค.
์ฌ๊ท ์ฟผ๋ฆฌ
1
2
3
4
5
6
7
8
9
10
11
12
13
|
WITH CONTINUOUS(NUM, RESULT) AS(
SELECT 1,1 FROM DUAL
UNION ALL
SELECT
NUM+1
,(NUM+1) + RESULT
FROM CONTINUOUS
WHERE NUM < 9
)
SELECT
NUM
,RESULT
FROM CONTINUOUS;
|
ORACLE RECURSIVE WITH๋ฅผ ์ฌ์ฉํด์ ์ฌ๊ท ์ฟผ๋ฆฌ๋ฅผ ์ ์ํด๋ดค์ต๋๋ค.
๋๊ธ