[英]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
我有一个包含三个表的 PostgreSQL 数据库:
user
:应用程序的用户列表。 主键是user_id
。course
:用户可以注册的课程目录。 主键是course_id
。enrollment
: 用户注册课程的记录。 主键是enrollment_id
。表之间的关系:
enrollment
表有两个不能为null的外键:
enrollment.user_id
.user_id 引用user.user_id
。enrollment.course_id
.course_id 引用course.course_id
。 如果user1
在course1
中enrollment
,则注册表中应该只有一条记录可用于将user1
加入course1
。
如果user1
未enrollment
course1
,则注册表中不存在将user1
加入course1
的记录。
问题:
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
由于没有用户未注册的课程的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
的 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 这里(Postgres 14)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.