LEFT OUTER JOIN 의 함정

Bobby·2021년 8월 10일
2

오답노트

목록 보기
1/6
post-thumbnail

데이터 조회 시 조인이 필요한 경우 LEFT OUTER JOIN 을 많이 사용한다.
기준 테이블을 두고 새로운 컬럼을 붙인다는 느낌으로 사용해 왔다.

LEFT OUTER JOIN 을 표현할 때 다음과 같은 그림을 많이 사용한다.

이와 같이 기준테이블은 변하지 않고 조인 조건에 맞는 행의 컬럼들이 기준테이블의 행에 추가 된다고 생각하고 사용해 왔고 원하는 결과를 얻어 왔다.

예를 들어 다음과 같은 두 테이블을 조인 한다면

SELECT t1.*, t2.color FROM table1 t1 LEFT OUTER JOIN table2 t2 ON t1.id=t2.userId;

다음과 같은 결과를 얻을 수 있다.

하지만 한가지 간과하고 있었다.

LEFT OUTER JOIN은 기준 테이블의 각 행에 조인 조건에 맞는 행이 1개 이하일 경우를 전제로 하고있다. (조인되는 행이 없다면 null 값이 추가)

보통 외래키를 사용하여 조인하므로 이 조건을 만족하고 있었기 때문에 문제가 발생하지 않았었다.

만약 기준 테이블의 행에 조인 되는 행이 2개 이상이 되면

SELECT t1.*, t2.color FROM table1 t1 LEFT OUTER JOIN table2 t2 ON t1.id=t2.userId;

다음과 같이 행이 뻥튀기 되어 버린다.

세상에는 수많은 테이블이 있다(?)

유니크한 값을 가져야 하는 컬럼이지만 귀차니즘으로 (외래키 귀찮~ 제약조건 걸면 귀찮~) 무시되어버린 테이블들이 있다.

이런 경우 데이터 무결성이 깨질 수 있고(유니크한 값을 가져야하지만 중복될 가능성), 이런 경우 행이 뻥튀기 되어 원하는 값을 얻을 수 없다.

나도 이런 테이블을 만났고 생각해보면 당연한 것인데 고민해 본 적이 없어 실수를 하게 되어 이 글을 쓰게 되었다..(지식 + 0.1)

이런 경우

  • 테이블간 제약 조건을 명확히 한다.
  • 조인 조건을 추가
  • distinct 사용
  • group by 사용
  • top 1, limit 사용

등등 중복을 제거해서 사용해야 한다.

LEFT OUTER JOIN 만 가지고 글을 작성하였지만 다른 조인 또한 마찬가지 이다.

SELECT t1.*, t2.color FROM table1 t1 INNER JOIN table2 t2 ON t1.id=t2.userId;

결론 : JOIN 을 사용할 때는 중복 값을 조심하자!

profile
물흐르듯 개발하다 대박나기

0개의 댓글