๊ณตํต ํ ์ด๋ธ ์(Common Table Expression)์ ์ฃผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ ํ ์ด๋ธ์ด ํ์ํ ๋ ์ฌ์ฉํ๋ฉฐ, ๋ฐ๋ก ๋ค์์ ์คํํ SELECT ๋ฌธ์๋ง ์ฌ์ฉํด์ผ ํ๋ค๋ ํน์ง์ด ์๋ค. ๊ณตํต ํ ์ด๋ธ ์์ ๋ชฉ์ ์ ๋ฐ๋ผ ์ผ๋ฐ ๊ณตํต ํ ์ด๋ธ ์๊ณผ ์ฌ๊ท ๊ณตํต ํ ์ด๋ธ ์์ผ๋ก ๋๋๋ค.
์ผ๋ฐ CTE
UNION ๋ฌธ ๊ณผ UNION ALL ๋ฌธ์ผ๋ก CTE ๊ฒฐํฉํ๊ธฐ
INTERSECT ๋ฌธ์ผ๋ก CTE ๊ฒฐํฉํ๊ธฐ
EXCEPT ๋ฌธ์ผ๋ก CTE ๊ฒฐํฉํ๊ธฐ
์ฌ๊ท CTE
์ฌ๊ท CTE๋ CTE ๊ฒฐ๊ณผ๋ฅผ CTE ๋ด๋ถ์ ์ฟผ๋ฆฌ์์ ์ฌ์ฌ์ฉํจ์ผ๋ก์จ ๋ฐ๋ณต ์คํํ๋ ์ฟผ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๋ค. ์ฌ๊ท CTE๋ ์ฃผ๋ก ๊ณ์ธต ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ ๋ ๋ง์ด ์ฌ์ฉํ๋ค.
WITH [CTE ์ด๋ฆ] ([์ด ์ด๋ฆ1], [์ด ์ด๋ฆ2]...)
AS (
<SELECT * FROM ํ
์ด๋ธ A> -- ์ฟผ๋ฆฌ 1 (์ต์ปค ๋ฉค๋ฒ)
UNION ALL
<SELECT * FROM ํ
์ด๋ธ B JOIN [CTE ์ด๋ฆ]> -- ์ฟผ๋ฆฌ 2(์ฌ๊ท ๋ฉค๋ฒ)
)
SELECT * FROM [CTE ์ด๋ฆ]
์ฌ๊ท CTE๋ ์ ์ผ๋ 2๊ฐ์ CTE ์ฟผ๋ฆฌ๊ฐ ํ์ํ๋ค. ์ด๋ ๊ฐ ์ฟผ๋ฆฌ๋ ์ต์ปค ๋ฉค๋ฒ์ ์ฌ๊ท ๋ฉค๋ฒ๋ฅผ ํฌํจํด์ผ ํ๋ค. ์ต์ปค ๋ฉค๋ฒ๋ ์๊ธฐ ์์ CTE๋ฅผ ์ฐธ์กฐํ์ง ์๋ ๋ฉค๋ฒ๋ฅผ ์๋ฏธํ๋ค. ์ฃผ์ํ ์ ์ ์ต์ปค ๋ฉค๋ฒ๋ 1๋ฒ์งธ ์ฌ๊ท ๋ฉค๋ฒ ์์ ์์ด์ผ ํ๋ค๋ ๊ฒ๊ณผ, ์ฌ๊ท ๋ฉค๋ฒ์ ์ด ์๋ฃํ์ ๋ฐ๋์ ์ต์ปค ๋ฉค๋ฒ์ ์ด ์๋ฃํ๊ณผ ์ผ์นํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ๋ํ ์ต์ปค ๋ฉค๋ฒ์ ์ฌ๊ท ๋ฉค๋ฒ๋ ์ฌ๋ฌ ๊ฐ ์ ์ํ ์ ์๋ค.
์ฌ๊ท CTE์ ์คํ ์์
- ์ต์ด์ ์ฟผ๋ฆฌ 1์ ์คํํ๋ค. ์ด๋ ์ฟผ๋ฆฌ 2์ ๊ธฐ๋ณธ๊ฐ์ 0์ผ๋ก ์ด๊ธฐํ๋๋ค.
- ์ด์ด์ ์ฟผ๋ฆฌ 2๋ฅผ ์คํํ๋ค. ์ด๋ ์ฟผ๋ฆฌ 2์ ๊ธฐ๋ณธ๊ฐ์ 1๋งํผ ์ฆ๊ฐํ๋ค. ์ฟผ๋ฆฌ 1์ ๊ฒฐ๊ณผ ํ ์๋งํผ ์ฟผ๋ฆฌ 2์์ CTE ์ด๋ฆ์ ์ฌ๊ท ํธ์ถํ๊ณ , ์ฟผ๋ฆฌ 2์ ๊ธฐ๋ณธ๊ฐ์ด 1์ฉ ์ฆ๊ฐํ๋ฉด์ ์ฟผ๋ฆฌ 1์ ๊ฒฐ๊ณผ ํ ์๊น์ง ๋๋ฌํด ๊ฒฐ๊ณผ๊ฐ ๋ ์๋ค๋ฉด ์ฌ๊ท ํธ์ถ์ ์ค๋จํ๋ค.
- ์ธ๋ถ SELECT ๋ฌธ์์ ๊ณผ์ 1, 2๋ฅผ ํตํด ๋ง๋ CTE ๋์ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ํ๋ค.
'Database > Do it! SQL ์ ๋ฌธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Do it! SQL ์ ๋ฌธ] 05-2. ๋ ์ง ํจ์ (1) | 2025.04.25 |
---|---|
[Do it! SQL ์ ๋ฌธ] 05-1. ๋ฌธ์์ด ํจ์ (0) | 2025.04.25 |
[Do it! SQL ์ ๋ฌธ] 04-2. ์๋ธ ์ฟผ๋ฆฌ (1) | 2025.04.18 |
[Do it! SQL ์ ๋ฌธ] 04-1. ์กฐ์ธ (0) | 2025.04.11 |
[Do it! SQL ์ ๋ฌธ] 03-7. SQL Server์์ ๋ค๋ฃจ๋ ์๋ฃํ ์ ๋ฆฌํ๊ธฐ (0) | 2025.03.28 |