DB

[SQL] ๊ทธ๋ฃน๋ณ„ 1๊ฑด๋งŒ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ• LEFT JOIN, ROW_NUMBER

hyonie 2025. 4. 7. 16:57

 

๐Ÿ“‚ ๋ชฉ์ฐจ

     


    ์˜ˆ์‹œ ์ฟผ๋ฆฌ ํ™•์ธํ•˜๊ธฐ

    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