반응형

여러개의 테이블을 조인할 때 생각한 거랑 다른 결과가 나오는데 그거에 대한 원칙들 몇가지를 정리한다

 

 

✔️ 일대다의 조인의 경우 다의 결과 개수를 따라갑니다 (A테이블의 10개 B테이블의 100개인경우 INNER JOIN할 때 100개가 나옵니다)

✔️ 다대다의 조인은 하면 안 된다 (이상한 결과값과 엄청난 데이터 뻥튀기가 된다)

✔️ 2개 테이블을 그냥 조인하는 거면 일대다의 경우 어디를 연결하냐는 크게 중요하지 않다 (성능 차이는 있지만 그건 결과랑 논외로 여기에선 다루지 않음)

✔️ 3개 이상의 테이블의 경우 나온 결과에 대해서 다시 조인하기 때문에 신경써서 조인해야한다

 

 

예제

2개의 테이블(A,B)을 조인해 나온 결과에 하나의 조인(C)을 추가할 경우 2개의 테이블을 조인해 나온 데이터에서 연결할려는 컬럼이 중복된 데이터가 있고 C의 테이블에도 중복된 데이터가 있으면 다대다 연결로 이상한 결과가 나오게 된다

 

 

그룹-상품 테이블 (A), 상품 테이블 (B), 카테고리 테이블 (C), 상품 입찰 테이블 (D) [예제]

# A, B, C 테이블 조인
select C.id , A.group_item_id
  from click_group_item A
  join ad_item B
    on A.ad_item_id = B.ad_item_id
  join category C
    on B.category_id = C.category_id
 where A.group_id='3';
 
 # 결과 (category 테이블의 id값이 중복된 이상한 형태)
 # id 	 group_item_id
 # 1037	 3
 # 1065  4
 # 1037  5
 # 1037  6
 
 # A, B, C, D 테이블 조인 [잘못된 버전]
select D.click_ad_category_id
  from click_group_item A
  join ad_item B
    on A.ad_item_id = B.ad_item_id
  join category C
    on B.category_id = C.category_id
  join click_ad_category_bid D
    on C.id = D.category_id
 where A.group_id='3';

# 결과 (category 테이블 id값이 중복된 거로 join column 선정해 이상한 값 도출)
# click_ad_category_id
# 11
# 11
# 11
# 19
# 19
# 19
# 23
# 23
# 23
# 27
# 27
# 27
# 64
# 64
# 64

 # A, B, C, D 테이블 조인 [잘 된 버전]
 select D.click_ad_category_id
  from click_group_item A
  join ad_item B
    on A.ad_item_id = B.ad_item_id
  join category C
    on B.category_id = C.category_id
  join click_ad_category_bid D
    on A.group_item_id = D.group_item_id
 where A.group_id='3';
 
# 결과 (중복 안 된 group_item_id값을 join column으로 선정해 정상 처리)
# click_ad_category_id
# 8
# 9
# 10
# 11
# 16
# 17
# 18
# 19
# 20
# 21
# 22
# 23

 

반응형