2017-06-27 26 views
2

私は個人的な教育実験として、架空の動物避難所のデータベースを構築しています。私は一般的にSQLとデータベースにはかなり新しいです。多対多の関係でConcatRelated()を使用する方法

タスク:ペットシェルターデータベースでペットのすべての所有者を検索する。

私は3つのテーブル:ペット、オーナー、Pets2Ownersを持っています。所有者は1つまたは複数のペットを持つことができ、ペットは1つ、多くの、または所有者を持たないことができます。テーブルは次のようになります。

Pets 
+--------+----------+ 
| ID  | Name  | 
+--------+----------+ 
|  1 | Opal  | 
|  2 | Fuzzy | 
|  3 | Angel | 
|  4 | Peewee | 
|  5 | Spike | 
+--------+----------+ 

Owners 
+----------+--------+ 
| ID  | Name | 
+----------+--------+ 
|  1 | Shy | 
|  2 | Belle | 
|  3 | Velvet | 
|  4 | Brilla | 
+----------+--------+ 

Pets2Owners 
+----+--------+----------+ 
| ID | Pet_ID | Owner_ID | 
+----+--------+----------+ 
| 1 |  1 |  2 | 
| 2 |  2 |  1 | 
| 3 |  3 |  1 | 
| 4 |  5 |  3 | 
| 5 |  5 |  4 | 
+----+--------+----------+ 

だから、Pets2Ownersから、我々はペット#3(エンジェル)(さんはシャイ)所有者の#1によって所有されていることがわかり、ペット#5(スパイク)は、両方の所有者が所有しています#3 & 4(ベルベットとブラジル)、ペット#4(ピービー)は誰も所有していません。

I SQLでの経験の浅い、と私はこれが可能であるが、このように、ペットを複製せずに私のペットとオーナーのすべての情報を提供し、単一のクエリを作成する方法があるかわからない:

+--------+--------+ 
| Pets | Owners | 
+--------+--------+ 
| Opal | Belle | 
| Fuzzy | Shy | 
| Angel | Shy | 
| Peewee | (none) | 
| Spike | Velvet | 
|  | Brilla | 
+--------+--------+ 

本質的には、3つのテーブルすべての情報を1つにまとめる方法が必要です。私は結合を使用しようとしましたが、それらは重複したエントリ(Spikeの場合は2行、所有者Velvetの場合は1行、所有者Brillaの場合は2行)を私に残します。

Spike's Owners 
+--------+ 
| Owners | 
+--------+ 
| Velvet | 
| Brilla | 
+--------+ 

が、私は同じ目標を達成するためにこれを使用すると、すべての所有者を持つことができます:

代わりに、それはそうのように、特定のペットのすべての所有者を返すクエリを作成することが可能です特定のペットはあなたの良いグリップを取得した後

+0

あなたは何データベースを使用していますか?適切なタグを付けてください。 –

+0

ああ、申し訳ありません! MS Access(私はおそらくSO上で最も人気のあるものではないことを知っています) – Somatic

+1

不均一な行数を返すクエリは実行できません(たとえば、Spikeに必要なことを示しています)。フロントエンドでレポートや表示を行います。 –

答えて

0

あなたは、このように単一の行を作成するために、アレン・ブラウンの機能ConcatRelated()を使用することができます。

| Spike | Velvet, Brilla | 

ConcatRelated()は1対多の関係のために設計されています。私はこのクエリPet_OwnerNamesと呼ば

SELECT Pets2Owners.Pet_ID, Owners.OwnerName 
FROM Pets2Owners INNER JOIN Owners ON Pets2Owners.Owner_ID = Owners.ID; 

:あなたは、多対多を持っているので、あなたは所有者名でペットのIDを組み合わせた中間クエリを必要としています。

その後ConcatRelated()は簡単です:

SELECT Pets.PetName, 
     ConcatRelated("OwnerName", "Pet_OwnerNames", "Pet_ID = " & ID) AS Owners 
FROM Pets; 

結果:

+---------+----------------+ 
| PetName |  Owners  | 
+---------+----------------+ 
| Opal | Belle   | 
| Fuzzy | Shy   | 
| Angel | Shy   | 
| Peewee |    | 
| Spike | Velvet, Brilla | 
+---------+----------------+ 
0
SELECT Pets.Name AS Pets, Owners.Name AS Owner 
FROM Pets2Owner INNER JOIN Pets ON Pets2Owner.[Pet Id] = Pets.[id] 
INNER JOIN Owners ON Pets2Owner.[Owner Id] = Owners.[id] 

を(SQL私は、その後、変数PetNameのための単一のクエリを作成し、任意の名前のためにそれを繰り返して聞かせた変数を持っている場合、私はわからないが)記載されていますJOINS、 Accessのパラメータを調べてみてください:)