0

3 つのテーブルを持つ PostgreSQL データベースがあります。

  • user: アプリケーションのユーザーのリスト。主キーはuser_id.
  • course: ユーザーが登録できるコースのカタログ。主キーはcourse_id.
  • enrollment: ユーザーのコースへの登録の記録。主キーはenrollment_id.

テーブル間の関係:

  • テーブルには、enrollmentnull にできない 2 つの外部キーがあります。

    • enrollment.user_id参照user.user_id
    • enrollment.course_id参照course.course_id
  • user1が に登録されている場合、 への参加に使用できるテーブルcourse1内のレコードは 1 つだけである必要があります。enrollmentuser1course1

  • user1がに登録されていない場合course1、に結合するテーブルにはレコードが存在しませんenrollmentuser1course1

問題:

  • 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_idnull. 同様に、 の 3 番目のレコードuser2は に登録されていないため欠落していますcourse3。これは私が望んでいるものではありません。

どうすればこの問題を解決できますか?

4

1 に答える 1