Return 结果来自 3 tables,其中结果数应等于 table 1 中的行数乘以 table 3 中的行数
Return results from 3 tables where the number of results should be equal to the number of rows in table 1 multiplied by the number of rows in table 3
我有一个包含三个 table 的 PostgreSQL 数据库:
user
:应用程序的用户列表。主键是 user_id
.
course
:用户可以注册的课程目录。主键是 course_id
.
enrollment
:用户报课记录。主键是 enrollment_id
.
table之间的关系:
enrollment
table有两个外键不能为空:
enrollment.user_id
引用 user.user_id
.
enrollment.course_id
引用 course.course_id
.
如果user1
加入了course1
,enrollment
table中应该只有一条记录可以用来加入user1
到 course1
.
如果user1
没有参加course1
,没有记录enrollment
table 加入 user1
到 course1
.
问题:
- 我不知道如何编写数据库视图,如果我有 2 个用户和 3 个课程,returns 6 行如下所示:
user_id | course_id | enrollment_id
-------------------------------------
user1 | course1 | enrollment id of user1 for course1 or null
user1 | course2 | enrollment id of user1 for course2 or null
user1 | course3 | enrollment id of user1 for course3 or null
user2 | course1 | enrollment id of user2 for course1 or null
user2 | course2 | enrollment id of user2 for course2 or null
user2 | course3 | enrollment id of user2 for course3 or null
一些上下文:
- 我无法更改数据库的任何内容。
- 我不关心性能。
我正在进行的工作:
我坦率地希望这会奏效:
select user.user_id, course.course_id, enrollment.enrollment_id
from user
full outer join enrollment on enrollment.user_id = user.user_id
full outer join course on course.course_id = enrollment.course_id
此查询没有 return 我期望的结果,因为没有 enrollment
用户未注册课程的记录。例如,结果看起来更像这样:
user_id | course_id | enrollment_id
-------------------------------------
user1 | null | null
user2 | course1 | enrollment id of user2 for course1
user2 | course2 | enrollment id of user2 for course2
这不是我所期望的,因为我希望 user1
的 table 到 return 3 条记录,谁没有参加任何课程,而不是只有一行course_id
和 enrollment_id
是 null
。同样,user2
的第三条记录丢失了,因为他们没有在 course3
中注册,这不是我所希望的。
我该如何解决这个问题?
交叉加入用户和课程,左加入注册:
select u.user_id, c.course_id, e.enrollment_id
from users u
cross join courses c
left join enrollment e
on e.user_id = u.user_id
and e.course_id = c.course_id
dbfiddle here(Postgres 14)
我有一个包含三个 table 的 PostgreSQL 数据库:
user
:应用程序的用户列表。主键是user_id
.course
:用户可以注册的课程目录。主键是course_id
.enrollment
:用户报课记录。主键是enrollment_id
.
table之间的关系:
enrollment
table有两个外键不能为空:enrollment.user_id
引用user.user_id
.enrollment.course_id
引用course.course_id
.
如果
user1
加入了course1
,enrollment
table中应该只有一条记录可以用来加入user1
到course1
.如果
user1
没有参加course1
,没有记录enrollment
table 加入user1
到course1
.
问题:
- 我不知道如何编写数据库视图,如果我有 2 个用户和 3 个课程,returns 6 行如下所示:
user_id | course_id | enrollment_id
-------------------------------------
user1 | course1 | enrollment id of user1 for course1 or null
user1 | course2 | enrollment id of user1 for course2 or null
user1 | course3 | enrollment id of user1 for course3 or null
user2 | course1 | enrollment id of user2 for course1 or null
user2 | course2 | enrollment id of user2 for course2 or null
user2 | course3 | enrollment id of user2 for course3 or null
一些上下文:
- 我无法更改数据库的任何内容。
- 我不关心性能。
我正在进行的工作:
我坦率地希望这会奏效:
select user.user_id, course.course_id, enrollment.enrollment_id
from user
full outer join enrollment on enrollment.user_id = user.user_id
full outer join course on course.course_id = enrollment.course_id
此查询没有 return 我期望的结果,因为没有 enrollment
用户未注册课程的记录。例如,结果看起来更像这样:
user_id | course_id | enrollment_id
-------------------------------------
user1 | null | null
user2 | course1 | enrollment id of user2 for course1
user2 | course2 | enrollment id of user2 for course2
这不是我所期望的,因为我希望 user1
的 table 到 return 3 条记录,谁没有参加任何课程,而不是只有一行course_id
和 enrollment_id
是 null
。同样,user2
的第三条记录丢失了,因为他们没有在 course3
中注册,这不是我所希望的。
我该如何解决这个问题?
交叉加入用户和课程,左加入注册:
select u.user_id, c.course_id, e.enrollment_id
from users u
cross join courses c
left join enrollment e
on e.user_id = u.user_id
and e.course_id = c.course_id
dbfiddle here(Postgres 14)