1. ๋ฌธ์ ์ค๋ช
2. ์ ๊ทผ๋ฐฉ์
๋จผ์ FISH_INFO ํ
์ด๋ธ์ด๋ FISH_NAME_INFO ํ
์ด๋ธ์ FISH_TYPE ์ปฌ๋ผ์ผ๋ก ์กฐ์ธ ํด ์ค๋ค.
๊ทธ๋ฆฌ๊ณ FISH_NAME์ผ๋ก GROUP BY ํด ์ฃผ๊ณ , LENGTH์ MAX ๊ฐ์ ๊ตฌํด์ฃผ๋ฉด ๋๋ค๊ณ ์๊ฐ ํ๋ค.
๐ ๐ปโโ๏ธ์ฒซ๋ฒ์งธ ์๋(์คํจ)
์ผ๋จ ์ด๊ฒ ๋ด๊ฐ ์ฒ์์ ์๊ฐํ๋ ์ฟผ๋ฆฌ์ด๋ค.
๋ฐ๋ก ๊ตฌ๋ฌธ ์ค๋ฅ๊ฐ ๋ด๋ค.
GROUP BY์ ์ ์ง๊ณ๋์ง ์์ ์ปฌ๋ผ A.ID๊ฐ ์๋ค๊ณ ํ๋ ์ค๋ฅ ๋ฉ์ธ์ง๊ฐ ๋ด๋ค.
ํ์ฌ GROUP BY ์ ์ B.FISH_NAME๋ง ์๊ณ , A.ID๋ GROUP BY์ ํฌํจ๋์ง ์์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค. ORDER BY์ A.ID๋ฅผ ์ฌ์ฉํ ๋, ๊ทธ ์ด์ด GROUP BY ์ ์ ํฌํจ๋์ด ์์ง ์์ผ๋ฉด ๊ฒฐ๊ณผ๊ฐ ์๊ธฐ์น ์๊ฒ ๋ํ๋ ์ ์๋ค๊ณ ํ๋ค. ๊ทธ๋์ GROUP BY ์ ์์ A.ID๋ฅผ ํฌํจํ๊ฑฐ๋ ์ง๊ณ ํจ์(MAX())๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค๊ณ ํ๋ค.
๊ทธ๋์ GROUP BY ์ ์๋ A.ID๋ฅผ ํฌํจ์์ผ ์ฃผ์๋ค.
๋ ์ ์ดํด ๋ณด๋๊น ALIAS๋ ์๋ชป์คฌ๋ค.
LENGTH ๋ผ๊ณ ์ถ๋ ฅํด์ผ ํ๋๋ฐ MAX_LENGTH๋ผ๊ณ ํด๋ฒ๋ ธ๋ค.
์ด ๋ถ๋ถ๋ ์์ ํด ์ฃผ์๋ค.
๐ ๐ปโโ๏ธ๋ ๋ฒ์งธ ์๋(์คํจ)
๊ฒฐ๊ณผ์ฐฝ์ ๋ณด๋ ์ค๋ณต๋ ๋ฌผ๊ณ ๊ธฐ๋ค์ด ๊ณ์ ๋์ค๊ณ ์์๋ค? ์ญ?
FISH_NAME ์์ DISTINCT๋ฅผ ์ถ๊ฐ ํด ์ฃผ์ด์ผ ํ๋...? ๋ ๋ง๋ ์๋๊ณ
๊ฐ์ ์ข
๋ฅ์ ๋ฌผ๊ณ ๊ธฐ ์ค์์ ๊ฐ์ฅ ํฐ ํ ๋ง๋ฆฌ๋ง ๋์ค๋๊ฒ ์๋๋ผ ์ฌ๋ฌ ๋ง๋ฆฌ ๋์ค๋ ์ด์ ๋ group by ์ ์ id ๊ฐ๋ ๊ฐ์ด ์จ์คฌ๊ธฐ ๋๋ฌธ์ด๋ค. group by ์ ์์ id๋ฅผ ๋นผ๋ฒ๋ฆฌ๋ฉด ์ฒซ๋ฒ์งธ ์๋์ฒ๋ผ ์์ ์ฟผ๋ฆฌ๊ฐ ์๋ ์ ํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํ๋ค.
๊ฒฐ๊ตญ ํด๊ฒฐ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง์ด๋ค.
์ฒซ ๋ฒ์งธ๋ก๋ GROUP BY์์ A.ID๋ฅผ ์ ์ธํ๊ณ FISH_NAME๋ง ๊ทธ๋ฃนํํ์ฌ, ๊ฐ FISH_NAME๋ณ๋ก ๊ฐ์ฅ ํฐ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ ํํ๊ณ , ๊ทธ ํ ID๋ก์ ๋ ฌํ๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด WHERE ์ ์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์จ ์ฃผ์ด์ผ ํ๋ค.
๋ ๋ฒ์งธ๋ก๋ ์๋์ฐ ํจ์์ธ ROW_NUMBER()์ ์จ์ฃผ๋ ๊ฒ์ด๋ค.
3. ์ ๋ต์ฝ๋
1) ์๋ธ์ฟผ๋ฆฌ๋ก ํธ๋ ์ฝ๋
SELECT A.ID, B.FISH_NAME, A.LENGTH AS LENGTH
FROM FISH_INFO A
JOIN FISH_NAME_INFO B ON A.FISH_TYPE = B.FISH_TYPE
WHERE A.LENGTH = (
SELECT MAX(LENGTH)
FROM FISH_INFO
WHERE FISH_TYPE = A.FISH_TYPE
)
ORDER BY A.ID;
GROUP BY์์ A.ID ์ ์ธํ๊ณ FISH_NAME๋ง ๊ทธ๋ฃนํ
WHERE A.LENGTH = (SELECT MAX(LENGTH) FROM FISH_INFO WHERE FISH_TYPE = A.FISH_TYPE) ์กฐ๊ฑด์ ์ฌ์ฉํด ๊ฐ FISH_NAME๋ณ๋ก ๊ฐ์ฅ ํฐ LENGTH๋ฅผ ๊ฐ์ง ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ ํ
์ดํ **ORDER BY A.ID**๋ฅผ ์ฌ์ฉํ์ฌ, ID ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
2) ์๋์ฐ ํจ์ ROW_NUMBER ์ผ๋ก ํ๊ธฐ
WITH RankedFish AS (
SELECT A.ID, B.FISH_NAME, A.LENGTH,
ROW_NUMBER() OVER (PARTITION BY B.FISH_NAME ORDER BY A.LENGTH DESC) AS rn
FROM FISH_INFO A
JOIN FISH_NAME_INFO B ON A.FISH_TYPE = B.FISH_TYPE
)
SELECT ID, FISH_NAME, LENGTH AS LENGTH
FROM RankedFish
WHERE rn = 1
ORDER BY ID;
์๋์ฐ ํจ์ ROW_NUMBER๋ก ํ๋ ค๋ฉด ๋จผ์ CTE๋ฅผ ์ ์ํด ์ฃผ์ด์ผ ํ๋ค.
์๋ SELECT ๋ถํฐ ์์ํ๋ ์กฐํ ๊ตฌ๋ฌธ์์ FROM ์ ์ ์ฐ์ผ ์์ ํ
์ด๋ธ์ ๋ง๋ค์ด ์ฃผ๋ ์์
์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
WITH RankedFish AS (...) ์ ๊น์ง ์คํ๋ ์ํ๋ CTE (Common Table Expression)๊ฐ ์ ์๋ ์ํ์ด๋ค. ์ฆ, RankedFish๋ผ๋ ์์ ํ
์ด๋ธ์ด ์ฟผ๋ฆฌ์ ๋๋จธ์ง ๋ถ๋ถ์์ ์ฌ์ฉ๋ ์ค๋น๊ฐ ๋ ์ํ์ด๋ค. CTE ํ
์ด๋ธ์ ๊ฐ์ง๊ณ ํ์ ์ฟผ๋ฆฌ๋ฅผ ํตํด ์ค์ ๋ก ์ต์ข
๋ฐ์ดํฐ๊ฐ ์ ํ๋๊ณ ํํฐ๋ง๋๋ค.
์์ ํ
์ด๋ธ RankedFish CTE๋ ๊ฐ FISH_NAME๋ณ๋ก ๊ฐ์ฅ ํฐ LENGTH๋ฅผ ๊ฐ์ง ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ฐ์ ์์์ ๋ฐ๋ผ ์ ๋ ฌํ๊ณ , ํ๊ณ ์์(rn)๋ฅผ ๋ถ์ฌํ ์ํ์ด๋ค. ๋ง์ฝ ๊ธฐ์กด ํ
์ด๋ธ์ ๋ฐ์ดํฐ์ ์ฐ์ด ๋ ๋ง๋ฆฌ, ์ฐธ์น, ๋ฐฐ์ค๊ฐ ๊ฐ๊ฐ ๋ ๋ง๋ฆฌ๊ฐ ์๋ค๊ณ ํ๋ฉด ๊ธธ์ด์ ๋ฐ๋ผ ์ฐ์ด๋ณ๋ก 1,2์ ๊ทธ๋ฆฌ๊ณ ์ฐธ์น๋ณ๋ก 1,2์, ๋ฐฐ์ค ๋ณ๋ก 1,2์๋ฅผ ๋งค๊ฒจ์ ๊ฐ 1,2 ๋ผ๋ ์ซ์๊ฐ rn์ปฌ๋ผ์ ๋ค์ด๊ฐ ์๋ ์ํ์ด๋ค.
์ฌ๊ธฐ์ ํ์ ์ฟผ๋ฆฌ๋ฅผ ์จ ์ฃผ์ด์ rn์ด 1์ธ ๋ฐ์ดํฐ๋ง ํํฐ๋งํ๊ณ
ID๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ ํด ์ฃผ๋ ๊ฒ์ด๋ค.