정산을 위한 판매기록을 위한 쿼리를 만드는중 다음과 같은 내용이 좀 헷갈려서요.
질문의 요지는
LEFT OUTER 문구에서 우측에 오는 테이블의 조건절에 두개이상의 테이블로 필터링 하는 문법입니다.
즉, A LEFT OUTER JOIN B ON A.id = B.A_ID (AND B.id = C.B_ID AND C.date = '1월 1일')
에서 위 붉은색부분에 대항하는 바른 문법입니다.
혹 질문이 부족할 수 있어 자세한 설명을 하나 들면
아래와 같이 A , B 두개의 테이블이 있고 A와 B는 1:N 의 관계입니다.
테이블 A |
테이블 B |
과일 |
사과 |
|
수박 |
자동차 |
트럭 |
|
버스 |
그리고 다음과 같이 판매기록(일시, 상품명, 가격)이 다음과 같이 테이블 C에 있습니다.
1월 1일 , 사과 , 500원
1월 1일 , 트럭 , 500원
1월 1일 , 사과 , 500원
1월 2일 , 트럭 , 1000원
1월 2일 , 수박 , 700원
원하는 결과는 아래와 같이 1월1일의 과일 판매현황(상품, 판매수, 가격합) 입니다.
사과 , 2개 , 1000원
수박 , 0개, 0원
left outer 를 사용해서
FROM A
LEFT OUTER JOIN B ON B.id = A.id
LEFT OUTER JOIN C ON B.id = C.id AND C.date = '1월 1일'
이렇게 하니 A에 대해서 B 와 C가 모두 걸려 B = C 의 관계가 적용되지 않더라고요.
그렇다고 아래와 같이 서브쿼리를 이용하니 데이타가 많아지니 엄청 늦어지고.
select
B.name,
(select count(*) from C where .. ) as cnt
(select sum(price) from C where .. ) AS price
고수분들의 도움을 기다립니다.
감사합니다. |