데이터 조회 시 조인이 필요한 경우 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)
이런 경우
등등 중복을 제거해서 사용해야 한다.
LEFT OUTER JOIN 만 가지고 글을 작성하였지만 다른 조인 또한 마찬가지 이다.
SELECT t1.*, t2.color FROM table1 t1 INNER JOIN table2 t2 ON t1.id=t2.userId;