여러 테이블의 JOIN


한 순간에는 두 개의 데이터 집합만 조인에 참여한다는 개념으로 접근하면 여러 테이블의 조인도 비교적 쉽게 해결 할 수 있다.

Shop(매장), Ord(주문), Member(회원), 세 개의 테이블을 조인하려고 한다. 아래 내용을 기억하면서 조인을 작성해보자.

매장(Shop), 주문(Ord), 회원(Member)의 ERD를 살펴보면 다음과 같다.

Untitled

세 테이블을 한 번에 조인하지 말고, 우선 Shop과 Ord만 조인해보자.

-- [SQL-7-7-1] 2019년 12월에 오픈한 매장의 2020년 전체 주문 정보 조회
-- 단 PLAT(플래티넘) 등급 회원의 주문 정보만 조회할것
-- Shop과 Ord만 조인
SELECT  T1.ShopId ,T1.ShopStartYmd ,T2.OrdNo ,T2.MemberId ,T2.OrdDtm ,T2.OrdAmt
FROM    startdb.Shop T1
        INNER JOIN startdb.Ord T2 ON (T2.ShopId = T1.ShopId)
WHERE   T1.ShopStartYmd LIKE '201912%'
AND     T2.OrdDtm >= STR_TO_DATE('20200101','%Y%m%d')
AND     T2.OrdDtm <  STR_TO_DATE('20210101','%Y%m%d')
ORDER BY T1.ShopID ,T2.OrdNo;

ShopId  ShopStartYmd  OrdNo  MemberId  OrdDtm               OrdAmt    
------  ------------  -----  --------  -------------------  --------  
S051    20191217      1534   M1318     2020-02-04 13:30:00  4000.000  
S051    20191217      1608   M1318     2020-02-06 13:30:00  4500.000  
S051    20191217      1632   M1318     2020-02-08 13:30:00  8500.000  
S051    20191217      1712   M1318     2020-02-13 13:30:00  8500.000 
… 생략 …

위 SQL을 통해 (Shop+Ord)라는 새로운 데이터 집합이 만들어진 것이다. 이제 이 데이터 집합에 Member를 추가로 조인하면 된다. Ord에 조인을 추가하는 것이 아니라 (Shop+Ord) 데이터 집합에 조인을 추가하는 것이다. (Shop+Ord) 데이터 집합에는 MemberId가 있으며, MemberId는 Member 테이블의 PK다. 그러므로 MemberId 컬럼을 이용해 두 데이터 집합을 조인처리하면 된다. 다음과 같다.

-- [SQL-7-7-2] 2019년 12월에 오픈한 매장의 2020년 전체 주문 정보 조회, 회원 정보도 필요
-- 단 PLAT(플래티넘) 등급 회원의 주문 정보만 조회할것
-- Member 조인 추가
SELECT  T1.ShopId ,T1.ShopStartYmd ,T2.OrdNo ,T2.MemberId ,T2.OrdDtm ,T2.OrdAmt
        ,T3.NickNm ,T3.MemberGd
FROM    startdb.Shop T1
        INNER JOIN startdb.Ord T2 ON (T2.ShopId = T1.ShopId)
        INNER JOIN startdb.Member T3 ON (T3.MemberId = T2.MemberId)
WHERE   T1.ShopStartYmd LIKE '201912%'
AND     T2.OrdDtm >= STR_TO_DATE('20200101','%Y%m%d')
AND     T2.OrdDtm <  STR_TO_DATE('20210101','%Y%m%d')
AND     T3.MemberGD = 'PLAT'
ORDER BY T1.ShopID ,T2.OrdNo;