...

WITH (์์ ํ ์ด๋ธ)
SQL์ ํตํด ๋น ๋ฐ์ดํฐ๋ผ ๋ถ๋ฆฌ๋ ๋งค์ฐ ํฌ๊ณ ๋ฌด๊ฑฐ์ด ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋๋ฐ, ์๋ก์ด ๊ฒฐ๊ณผ๋ฅผ ์ํ๊ณ ์ ์ฅํ ๋๋ง๋ค table์ ์ ์ฅํ ์ ์๋ค. ๋ํ, ์ค๋ฌด์์๋ ์ค์ ์คํ ์๋๋ ๋น ๋ฅด๊ฒ ์งํ๋์ด์ผ ํ๋ฏ๋ก SQL์๋ ์์ ํ ์ด๋ธ์ ๋ง๋๋ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค.
WITH TEMP_TABLE as
(
SELECT NAME, count(NAME)
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
ORDER BY NAME
)
SELECT * FROM TEMP_TABLE
WHERE COUNT > 1
with์ ์ ๋์ผํ SQL์ด ๋ฐ๋ณต๋์ด์ ์ฌ์ฉ๋ ๋ ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
table์ ๋ง๋ค์ง ์๊ณ ๋ table ๋ง๋ ๊ฒ๊ณผ ๊ฐ์ ํจ๊ณผ๋ฅผ ๋ด๋๋ฐ, ์ค์ ๋ก๋ temp๋ผ๋ ์์ ํ ์ด๋ธ์ ์ ์ฅ๋๋ ๊ฒ์ด๋ค.
โ
๋น์ทํ ๊ธฐ๋ฅ์ ํ๋ ๋ทฐ๋, ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฌธ์ ํ ์ด๋ธ๋ก ์ ์ฅํ๋๊ฒ ์๋๋ผ, ๊ทธ๋ฅ ๋ณ์นญ๋ง ํด์ฃผ๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ๋ทฐ๋ฅผ ๋ถ๋ฌ์ค๋ฉด ์ฟผ๋ฆฌ๋ฌธ์ด ๊ทธ๋๋ก ์คํํ๋ ๊ฒ๊ณผ ๊ฐ๋ค.
ํ์ง๋ง with๋ ๊ฐ์์ ํ ์ด๋ธ, ์ฆ ํ ์ด๋ธ์ด๋ค.
๋์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ๋ค๋ ๋จ์ ์ด ์๋ค.
# UNION ๊ฒฐ๊ณผ : 1,2 ์ถ๋ ฅ
SELECT 1 AS num
UNION
SELECT 2 AS num;
# WITH, UNION ๊ฒฐ๊ณผ : 1,2 ์ถ๋ ฅ
WITH test AS
(
SELECT 1 AS num
UNION ALL
SELECT 2 AS num
)
SELECT * FROM test;
# WITH, UNION ๊ฒฐ๊ณผ : 1,2,2,2,... (empํ
์ด๋ธ์ ํ์๋งํผ 2๊ฐ ๋ฐ๋ณต๋จ)
WITH test AS
(
SELECT 1 AS num
UNION ALL
SELECT 2 AS num FROM emp # ์ด ๋ฌธ์ฅ์ emp ํ
์ด๋ธ์ ํ์๋งํผ ๋ฐ๋ณต๋๋ค
)
SELECT * FROM test;
โ์์)
Q. ์ฌ์(emp) ํ ์ด๋ธ์์ ์ง์ ๋ณ ์๊ธ ํฉ์ฐ๋ถ์ ์ถ๋ ฅํ๋๋ฐ ์ง์ ๋ณ ์๊ธ ํฉ์ฐ๋ถ์ ํ๊ท ๋ณด๋ค ๋์ ๊ฒ๋ง ์ถ๋ ฅํ์์ค!
โ
๋
ธ๋ฉ ์ฟผ๋ฆฌ
select job, sum(sal)
from emp
group by job
having sum(sal) > (select avg(sum(sal)) from emp group by job) ;

โ
with์ ์ฌ์ฉํ ์ฟผ๋ฆฌ
with eee as
(
select job, sum(sal) as total
from emp
group by job
)
select job, total
from eee
where total > (select avg(total) from eee);

โ
- ๊ฒฐ๊ณผ๋ ๋์ผํ๋ค.
โ
ํ์ง๋ง with์ ์ ์ฌ์ฉํ๋ ์ด์ ์ด์ with์ ์ ์ฅ์ ์ temp๋ผ๋ ์์ ํ ์ด๋ธ์ ์ฌ์ฉํด์ ์ฅ์๊ฐ ๊ฑธ๋ฆฌ๋ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํด๋๊ณ ์ ์ฅํด๋์ ๋ฐ์ดํฐ๋ฅผ ์์ธ์คํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ์ข๋ค.
โ
๊ทธ๋ ๋ค๋ฉด ๋ชจ๋ with์ ๋ก ์ฌ์ฉํ๋ฉด ๋์ง ์๋๊ฐ? ๋ผ๋ ์ง๋ฌธ์ ๋ตํ๋ฉด ์๋๋ค.
with์ ์ ๋๋ฌด ๋จ๋ฐํด์ ๊ฐ์ ์๊ฐ์ ์ฌ๋ฌ ๊ฐ์ with์ ์ ๋์์ ๋๋ฆฌ๋ฉด temp(์์ ํ ์ด๋ธ)๊ฐ ๊ฒฌ๋ ์ ์๋ ์ ๋๊ฐ ๋์ด๊ฐ์ ๋ค๊ฐ์ด ๋๋ ค์ง๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฅผ ์ํด with์ ์๋ ๋ ๊ฐ์ง ์ต์ ์ด ์๋ค.
โ
โข materialize
materialize๋ ๊ธฐ๋ณธ with์ ์ฌ์ฉ ์ ์ ์ฉ๋๋ ๊ฒ์ผ๋ก temp(์์ ํ ์ด๋ธ)๋ฅผ ์ฌ์ฉํ๋ค.
๊ทธ๋์ ์คํ์๊ฐ์ด ๋จ์ถ๋๋ค.
โ
โข inline
inline์ temp ํ ์ด๋ธ์ ์์ฑํ์ง ์๊ณ inline view๋ก ์ํํ๋ ๊ฒ์ด๋ค.
์คํ๋ฐฉ๋ฒ์ with์ ์ฌ์ฉ ์ select ๋ค์ /*+materialize */, /*+inline */ ๋ฅผ ๋ถ์ฌ์ค๋ค.
with eee as (
select /*+inline */ job, sum(sal) as total
from emp
group by job
)
select job, total
from eee
where total > (select avg(total) from eee);
์ปค์คํ ์์ ํ ์ด๋ธ
ํ ์ด๋ธ์ ๋ง๋ค๋ ์์ ์์ ํ ์ด๋ธ๋ก ๋ง๋๋ ๋ฐฉ๋ฒ๋ ์๋ค.
๋ค๋ง "์์"๋ผ๋ ์๋ฏธ์ ๋ง๊ฒ ์ ์ธ์ ๊น์ง ์ ์ฅ๋๋ ํ ์ด๋ธ์ด๋ผ๋ ์กฐ๊ฑด์ด ์์ด์ผ ํ๋๋ฐ,
- โcommit ํ ๋ ๊น์ง : on commit delete rows
- ์ธ์ ์ด ์ข ๋ฃ๋ ๋๊น์ง : on commit preserve rows (SQL์ ๋๋๊น์ง)
โ์ผ๋ก ๊ตฌ๋ถํ ์ ์๋ค.
โ
์์ )
Q. commitํ๋ฉด ์ฌ๋ผ์ง๋ ์์ ํ ์ด๋ธ emp_temp๋ฅผ ๋ง๋์์ค!
create global temporary table emp_temp
on commit delete rows
as
(
select *
from emp
where 1=2 ; #table์ ํ๋ง ๊ฐ์ ธ๋ ๋ฐฉ๋ฒ
)
where 1=2๋ True๊ฐ ์๋๋ค. ๋ฐ๋ผ์ ์กฐ๊ฑด๋ฌธ์ด ํด๋น๋๋ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฏ๋กํ์ฌ from์ ์๋ table์ ํ(์ปฌ๋ผ ์ ๋ฑ)๋ง ๊ฐ์ ธ์ค๊ฒ ๋ค. ๋ผ๋ ์๋ฏธ์ด๋ค.
โ
์ดํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์ง์ด๋ฃ๊ณ ์กฐํํด๋ณด๋ฉด,
insert into emp_temp
select * from emp;
select * from emp_temp; -- โ ๋ฐ์ดํฐ ์ ์ ์
๋ ฅ ํ์ธ!
commit;
select * from emp_temp; -- โ ๋ฐ์ดํฐ๊ฐ ์๋ค!

Reference
https://hsdevelopment.tistory.com/653
https://hyunmin1906.tistory.com/149
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.