์์ ์ฟผ๋ฆฌ ํ์ธํ๊ธฐ
WITH RankedData AS (
SELECT
a.OrderID,
c.SafeKey,
ROW_NUMBER() OVER (PARTITION BY a.OrderID ORDER BY c.SafeKey) AS rn
FROM SalesDB.dbo.Orders a
LEFT OUTER JOIN SalesDB.dbo.CreditCheckResult b
ON a.CreditCheckID = b.ID
LEFT OUTER JOIN SalesDB.dbo.SafeKeyLog c
ON c.SafeKey = b.SafeKey
WHERE a.OrderID IN (
10001, 10002, 10003, 10004, 10005, 10006, 10007, 10008
)
)
SELECT OrderID, SafeKey
FROM RankedData
WHERE rn = 1;
์์๋ก 10001, 10002, 10003, 10004, 10005, 10006, 10007, 10008 ์ด๋ฌํ OrderID ๋ฅผ ์กฐํํ๋๋ฐ, ๊ทธ์ค 1๋ฒ์งธ OrderID ๋ง ๊ฐ์ ธ์จ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
1. WITH RankedData AS (...)
์์๋ก ์ด๋ฆ ๋ถ์ธ ๊ฐ์์ ํ ์ด๋ธ์ ๋จผ์ ๋ง๋ค์ด ๋ก๋๋ค.
- WITH๋ ๊ณตํต ํ ์ด๋ธ ํํ์(CTE)์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
- ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๊ธฐ ์ข๊ฒ ๋ง๋ค๊ฑฐ๋, ์ค๋ณต๋ ์ฝ๋๋ฅผ ์ค์ผ ๋ ์ฌ์ฉํฉ๋๋ค.
- ์ฌ๊ธฐ์ RankedData๋ ์ด ๊ฐ์์ ํ ์ด๋ธ์ ๋ถ์ธ ์ด๋ฆ์ ๋๋ค.
2. SELECT ... ๋ด๋ถ
SELECT
a.OrderID,
c.SafeKey,
ROW_NUMBER() OVER (PARTITION BY a.OrderID ORDER BY c.SafeKey) AS rn
๐ ROW_NUMNER() OVER (...) AS rn
ID ๋ง๋ค ๋ฒํธ๋ฅผ ๋งค๊น๋๋ค.
- ์ด๊ฑด ์๋์ฐ ํจ์์ ๋๋ค. ๊ทธ๋ฃน๋ณ๋ก ์์๋ฅผ ๋งค๊ฒจ์ฃผ๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
- PARTITION BY a.OrderID > OrderID๋ณ๋ก ๋ฌถ์ต๋๋ค.
- ORDER BY c.SafeKey > ์ธ์ดํํค ์์๋๋ก ๋ฒํธ๋ฅผ ๋งค๊น๋๋ค.
- AS rn > ์ด ๋ฒํธ๋ฅผ rn ์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ฅ
๋น์ ํ์๋ฉด? ์์ ์์ OrderID๋ก ์ ๋ ฌํ๊ณ , ๊ทธ์์์ SafeKey๋ก ๋ค์ ์ ๋ ฌํด์ 1,2,3 ... ๋ฒํธ๋ฅผ ๋ถ์ด๋ ๋๋์ ๋๋ค.
3. FROM ... JOIN ...
์ฌ๋ฌ ํ ์ด๋ธ์ ํฉ์ณ์ ๊ด๋ จ ์ ๋ณด๋ค์ ํ ๋ฒ์ ๊ฐ์ ธ์ต๋๋ค.
FROM SalesDB.dbo.Orders a
LEFT OUTER JOIN SalesDB.dbo.CreditCheckResult b
ON a.CreditCheckID = b.ID
LEFT OUTER JOIN SalesDB.dbo.SafeKeyLog c
ON c.SafeKey = b.SafeKey
- LEFT OUTER JOIN์ ์ผ์ชฝ ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ด๋ ๊ฒ
- ๋งค์นญ๋๋ ๊ฒ ์์ผ๋ฉด ์ค๋ฅธ์ชฝ ๊ฐ์ NULL ์ด ๋ฉ๋๋ค.
- Orders a > CreditCheckResult b > SafeKeyLog c ๋ก ์ฐ๊ฒฐ๋๊ณ ์์ต๋๋ค.
4. WHERE a.OrderID IN (...)
ํด๋น OrderID๋ค๋ง ์กฐํ
WHERE ์กฐ๊ฑด๋ฌธ์์ IN (...)์ ์ฌ๋ฌ ๊ฐ ๊ฐ ์ค ํ๋๋ผ๋ ๋ง์ผ๋ฉด ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
5. ๋ง์ง๋ง SELECT
SELECT OrderID, SafeKey
FROM RankedData
WHERE rn = 1;
์์ 1๋ฒ์์ ๋ง๋ ๊ฐ์์ ํ ์ด๋ธ์์ ๊ฐ OrderID๋น ์ฒซ๋ฒ์งธ ์ค๋ง ๋ณด์ฌ์ค๋๋ค.
- rn =1 > ์๊น ๋ฒํธ ๋งค๊ฒผ๋ ๊ฒ ์ค ์๋ฒ 1๋ฒ๋ง ๊ฐ์ ธ์ต๋๋ค (์ฆ, OrderID๋ณ 1๊ฑด๋ง ์ถ์ถ)
- ์ธ์ดํํค๊ฐ ์๋ ๊ฒฝ์ฐ์๋ NULL๋ก ๋์ต๋๋ค.
๐์ ๋ฆฌ
๋ฌธ๋ฒ | ์ค๋ช | ์ค์ ํจ๊ณผ |
WITH ...AS | ๋ฏธ๋ฆฌ ์ ๋ฆฌํ ์์ ํ ์ด๋ธ ๋ง๋ค๊ธฐ | ๋ณต์กํ ์ฟผ๋ฆฌ ์ ๋ฆฌ |
ROW_NUMBER() OVER(...) | ๊ทธ๋ฃน ์์์ ์๋ฒ ๋งค๊ธฐ๊ธฐ | ID๋ง๋ค 1๋ฒ 2๋ฒ.. |
LEFT OUTER JOIN | ์๋ ๋ฐ์ดํฐ๋ ์ ์งํ๋ฉด์ ํฉ์น๊ธฐ | ์ ๋ณด ๋๋ฝ ๋ฐฉ์ง |
WHERE ... IN (...) | ํ์ํ ID๋ง ๊ณจ๋ผ๋ด๊ธฐ | ๋ฒ์ ์ ํ |
SELECT ... WHERE rn = 1 | ๊ทธ๋ฃน๋ณ ์ฒซ ์ค๋ง ๋ณด๊ธฐ | ID๋น 1๊ฑด๋ง ์ถ์ถ |
'DB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Windows OS ํ๊ฒฝ์์ PostgreSQL ์ค์นํ๊ธฐ (1) | 2024.05.26 |
---|