A테이블
xid contractMoney
10 1000,000
B테이블
Bid xid payMoney
1 10 1000,00
2 10 3000,00
C테이블
Cid xid bdMoney
1 10 10,000
2 10 20,000
이렇게 테이블이 구성되어있습니다.
select contractMoney, contractMoney-sum(payMoney) , sum(payMoney), sum(by_mondy) from A테이블 as a LEFT JOIN B테이블 as b on A.xid = B.xid LEFT JOIN C테이블 as c on A.xid = C.xid where A.xid = 10
위의 쿼리를 사용했을 경우 sum함수를 사용했을 경우 항목들의 합계 xid가 10인 데이터들만 합계가 나와야 하는데 해당 B테이블, C테이블에
등록된 모든 데이터들의 합계가 출력되어 버리네요 ㅜㅜ
쿼리문에서 C테이블 빼고 A,B테이블만 left join했을 경우 sum 함수를 사용했을 시 xid 가 10인 건들만 합계가 되어 나오는데
left join 하나가 더 추가되니 엉뚱한 데이터가 출력이 됩니다.
어떻게 해야 xid 10인 건들만 정상적으로 합계를 구할수 있을까요?
(단편적으로 A,B,C 테이블만 예로 들었지만 실질적으로 테이블이 좀 더 추가될수 있습니다.)
조인은 보통 1:1 또는 1:다 조인을 해야 합니다.
그런데 지금 다:다 조인이 되어 버렸네요?
A:B:C 의 관계가 1:다:다 입니다.
다:다 관계의 경우 카티션프러덕트라고 하는 원치않는 뻥튀기 현상이 발생됩니다.
위의 경우 B 2건, C 2건으로 2 * 2 = 4 가 되어 버림. 값이 두배로 나오게 됨.
다:다 관계를 1:1 관계로 만들어 조인해야 합니다.
SELECT a.xid , a.contractMoney , a.contractMoney - IFNULL(b.payMoney, 0) , b.payMoney , c.by_mondy FROM A테이블 a LEFT OUTER JOIN (SELECT xid , SUM(payMoney) payMoney FROM B테이블 WHERE xid = 10 GROUP BY xid ) b ON a.xid = b.xid LEFT OUTER JOIN (SELECT xid , SUM(by_mondy) by_mondy FROM C테이블 WHERE xid = 10 GROUP BY xid ) c ON a.xid = c.xid WHERE a.xid = 10 ;