0

n:m 関係で相互に関連付けられている 3 つのテーブルから完全な結果セットを作成する SQL クエリ (完全外部結合を使用) を作成しようとしています。

初期の状況は、 person 、 artifact 、および location の3 つのエンティティを持つ正規化されたデータ モデルです。各エンティティは、交差テーブルで表される an:m-relationship を介して他のすべてのエンティティに関連付けられています。

person { person_id, ... }  
artifact { artifact_id, ... }
location { location_id, ... }

rel_person_artifact { person_id, artifact_id, role_id }
rel_person_location { person_id, location_id, role_id }
rel_artifact_location { artifact_id, location_id, role_id }

私の目標は、すべての人、成果物、場所を含む 3 つのテーブルすべてから結果セットを作成することです。

問題を解決するために、次のステートメントを試しました。

select
  *
from
  person per
  full outer join rel_person_artifact rpa on per.person_id = rpa.person_id
  full outer join artifact art on art.artifact_id = rpa.artifact_id
  full outer join rel_artifact_location ral on ral.artifact_id = art.artifact_id
  full outer join location loc on loc.location_id = ral.location_id
  full outer join rel_person_location rpl on rpl.person_id = per.person_id;

このクエリは構文的には正しいですが、結合が次々とテーブルを処理するため、古いコンテンツが返されます。結局のところ、すべての関係が結果セットに表示されるわけではありません。

完全で正しい結果セットを得るために上記の表を組み合わせる方法はありますか?

編集。以下にいくつかのサンプル レコードを示します (交差テーブルに固執します)。

rel_person_artifact ( 'Peter', 'car 1', 'owner' ), ( 'Alex', 'car 1', 'driver' )
rel_person_location ( 'Peter', 'location 1', 'home' ), ( 'Paul', 'location 2', 'place of work' )
rel_artifact_location ( 'car 1', 'location 1', 'parking' )

もちろん、データはこの例よりもはるかに複雑になる可能性があります。以下のコメントで述べたように、循環関係もあるかもしれません。

結果セットがどのように見えるべきかわかりません。この組み合わせが可能かどうかさえわかりません。

どうもありがとうございました!

よろしく

4

1 に答える 1