Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用外部联接和笛卡尔积联接三个表_Sql_Database_Postgresql - Fatal编程技术网

Sql 如何使用外部联接和笛卡尔积联接三个表

Sql 如何使用外部联接和笛卡尔积联接三个表,sql,database,postgresql,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

我在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
当用户未访问某个位置时,我希望visits变量包含0=活动中没有条目,如果用户访问了该位置,则活动计数

但我只得到用户访问过的位置:

venue | visits
  1       3
  2       4
  3       22
  4       1
我原以为,右侧外部联接将返回右侧的所有条目,但事实并非如此。

请检查以下内容:


基本的连接解释-它们可能会令人困惑。我认为您要么要切换第一个联接中的列,要么改用左外部联接。

左外部联接意味着您需要左侧表中的所有实体,无论联接条件或谓词是否满足

但这也是极少数情况之一,笛卡尔积交叉联接实际上是必要的,因为您希望看到每个用户的每个地点。请尝试使用以下方法:

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

我已经尝试过了,但是我得到了与您编辑的正确join returnsthx相同的输出,但是我得到了一个错误,在join viouses as v行附近。它不应该来自用户u,场馆v而不是加入场馆v吗?嗯,*=不适用于PostgreSQL,还有其他方法吗?你为什么要说老式的符号;更新了笛卡尔乘积查询。您需要明确指定交叉连接才能获得产品。它们可能会让人困惑——事实上,您链接到的文档的作者有一个错误陈述:左外连接B相当于右外连接a,列的顺序不同——它们的意思肯定是,……表的顺序不同。