2011-04-26 4 views
2

사용자, 활동, 장소 등 PostgreSQL DB에 3 개의 테이블이 있습니다.외부 조인 및 데카르트 제품으로 세 개의 테이블을 결합하는 방법

Users: 
- id 
- name 

Visits: 
- id 
- user_id 
- location_id 

Venues: 
- id 
- name 

사용자가 아직 위치를 방문하지 않은 경우 특정 사용자, 이벤트의 모든 활동을 검색하려고합니다. 일부 조인과 나는 그것을 시도했다 :

SELECT venues.id as venue, COUNT(activities.id) as visits 
FROM users 
RIGHT OUTER JOIN activities ON users.id=activities.user_id 
RIGHT OUTER JOIN venues ON activities.venue_id=venues.id 
WHERE users.id=1234 
GROUP BY venues.id 
ORDER BY venues.id 

나는 사용자가 위치를 방문 (= 활동에 항목 없음) 활동의 수를 사용자가 경우가하지 않은 경우 방문 변수가 0을 포함 할 위치를 방문했다.

venue | visits 
    1  3 
    2  4 
    3  22 
    4  1 

내가 RIGHT OUTER JOIN가 오른쪽에서 모든 항목을 반환 할 것이라고 생각하지만,하지 않습니다 :

하지만 난 단지 사용자가 방문했던 위치를 얻는다.

답변

8

LEFT OUTER JOIN은 왼쪽 테이블의 모든 엔티티가 JOIN 조건 (또는 조건 자)이 충족되는지 여부를 나타냅니다.

그러나 모든 사용자에게 모든 장소를보고 싶어하기 때문에 Cartesian 제품 (CROSS JOIN)이 실제로 필요한 드문 경우 중 하나입니다. 이 같은 CROSS JOIN 사용해보십시오 : - : "A LEFT OUTER는 B RIGHT OUTER가 가입에 B가 동일합니다 가입"그들이 혼란 스러울 수있다 "

SELECT v.id as venue, COUNT(a.id) as visits 
FROM users AS u 
CROSS JOIN venues as v --<-- CROSS JOIN for Cartesian product between users and venues 
LEFT JOIN activities AS a ON u.id = a.user_id AND a.venue_id = v.id 
WHERE u.id = 1234 
GROUP BY v.id 
ORDER BY v.id 
+0

나는 그것을 시도했다, 오른쪽 조인과 동일한 결과를 얻는다. 편집을 위해서 – 23tux

+0

thx가 반환되지만,'JOIN venues AS v' 라인 근처에서 오류가 발생한다. '. 'JOIN venues as v'대신 'FR as users AS u, venues AS v'가되어서는 안됩니까? – 23tux

+0

hmmmm,'* ='는 PostgreSQL에서 작동하지 않습니다. 다른 방법이 있습니까? 그리고 왜 옛 학교 표기법을 말하는거야? ;) – 23tux

2

확인이 아웃 :

http://db.apache.org/derby/docs/10.2/ref/rrefsqlj57522.html

기본은 혼란 스러울 수 있습니다 explanations-- 가입 할 수 있습니다. 첫 번째 조인에서 열을 전환하거나 대신 왼쪽 외부 조인을 사용하려고한다고 생각합니다.

+1

사실, 문서의 저자는 당신에이 왜곡 표시를하게 연결 다른 순서로 기둥으로 "- 분명히 그들은"** 표를 다른 순서로 ** "의미했습니다. – onedaywhen

+0

좋은 캐치! 나는 그것에 데리러하지 않았다 ... – Ben

관련 문제