3 つのテーブルを持つ PostgreSQL データベースがあります。
user
: アプリケーションのユーザーのリスト。主キーはuser_id
.course
: ユーザーが登録できるコースのカタログ。主キーはcourse_id
.enrollment
: ユーザーのコースへの登録の記録。主キーはenrollment_id
.
テーブル間の関係:
テーブルには、
enrollment
null にできない 2 つの外部キーがあります。enrollment.user_id
参照user.user_id
。enrollment.course_id
参照course.course_id
。
user1
が に登録されている場合、 への参加に使用できるテーブルcourse1
内のレコードは 1 つだけである必要があります。enrollment
user1
course1
user1
がに登録されていない場合course1
、に結合するテーブルにはレコードが存在しません。enrollment
user1
course1
問題:
- 2 人のユーザーと 3 つのコースがある場合、次のような 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
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
これは私が期待するものではありません. テーブルが の 3 つのレコードを返すようにしたいのでuser1
, 誰がどのコースにも登録されていcourse_id
ませenrollment_id
んnull
. 同様に、 の 3 番目のレコードuser2
は に登録されていないため欠落していますcourse3
。これは私が望んでいるものではありません。
どうすればこの問題を解決できますか?