A와B, A와C가 서로 연관관계가 있을 경우 3개의 테이블을 조인하여 각각 B와 C를 count하는 방법이 있을까요? 0 4 771

by 쿼리냠냠 [SQL Query] [2021.11.10 18:37:49]


구루비회원님들 안녕하세요.
어떻게 설명해야할지 몰라 예시를 통해서 보여드리도록하겠습니다.

A테이블

A_id name
1 감자
2 테이블

 

B테이블

b_id a_id(fk) name
1 1 b의 값1
2 2 b의 값2
3 2 b의 값3


C테이블

c_id a_id(fk) name
1 1 a의값 1
2 1 a의값 2
3 2 a의값 3
3 1 a의값 4

 

원하는 결과값은 다음과 같습니다.

a_id b의 카운트 c의 카운트
1 1 3
2 2 1

A테이블에는 로우가 [1,2]가 존재하는데요. 
b테이블에서 1,2의 총개수를 구하고싶고
c테이블에서도 1,2의 총개수를 각각 구하고싶습니다. 

1, A테이블과 B테이블을 조인하여 group BY해서 b의 카운트값을 구하고
2. A테이블과 C테이블을 조인하여 group by해서 c의 카운트값을 구하면 되는데요.
이렇게 하면 2번의 쿼리문을 날려서 값을 가져오게되는데 
좀 더 나은 방법이나 하나의 쿼리문으로 해결할 수 있을까요? 


 

읽어주셔서 감사드립니다.
좋은 하루보내세요.
 

by pajama [2021.11.10 22:12:10]

count distinct 하시면 됩니다~

 

SELECT A.A_ID, COUNT(DISTINCT B.B_ID), COUNT(DISTINCT C.C_ID)
FROM TABLE_A A, TABLE_B B, TABLE_C C
WHERE A.A_ID = B.A_ID (+)
AND A.A_ID = C.A_ID (+)
GROUP BY A.A_ID

 


by 쿼리냠냠 [2021.11.11 10:08:58]

답변 감사합니다! 
DISTINCT문을 가지고 해결이 가능하군요!

좋은 하루 보내세요!


by 마농 [2021.11.11 08:07:27]

1:M:N 조인은
바로 조인하면 카티션곱이 발생하여 자료가 중복되게 됩니다.(성능저하, 중복제거 필요)
1:M 조인 결과를 1로 만들어 다시 1:N 조인을 할 수도 있고
M 과 N 을 각각 1로 만들어 1:1:1 조인을 할 수도 있습니다.
성능까지 고려한다면?
어떤 방법이 유리할지는 실제 상황을 여러가지 각도로 살펴봐야 합니다.
검색 조건이 별도로 존재하는지? 인덱스는 어떻게 되어 있는지? 건수는 얼마나 되는지? 등등


by 쿼리냠냠 [2021.11.11 10:21:18]

마농님 답변감사합니다.
1:M:N 조인으로 검색하니 여러 참고 자료들이 나오는군요. 
http://gurubee.net/article/80833 이부분도 참고해서 확인해보도록하겠습니다.

감사합니다! 좋은하루보내세요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입