如何使用外连接和笛卡尔积来连接三个表

时间:2011-04-26 14:22:11

标签: sql database postgresql

我在PostgreSQL数据库中有三个表:用户,活动,场地。

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将从右侧返回所有条目,但事实并非如此。

2 个答案:

答案 0 :(得分:8)

LEFT OUTER JOIN意味着你想要左手表中的所有实体是否满足JOIN条件(或谓词)。

但这也是极少数情况下笛卡尔积(CROSS JOIN)实际上是必要的,因为你想看到每个用户的每个场地。尝试使用CROSS JOIN,如下所示:

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

答案 1 :(得分:2)

检查出来:

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

基本联接解释 - 它们可能令人困惑。我想你要么想要在第一次连接中切换列,要么使用左外连接。