2012-01-08 21 views
19

これはpostgresデータベースです。私は繁殖表から犬種別の名前(Cane Corso、Labradorなど)を引き出し、動物表にある外来キーに基づいて表示しようとしています。私の問題は、この単一の品種テーブルへの2つの外部キーが動物テーブルにあります。最初の品種の名前は左の結合に基づいて返されますが、2番目の名前はすでに左の結合があるので表示する名前を取得できません。Postgres複数の結合

breed table (ID, BreedName) 
animal table (ID, breedID, breed2ID) 

SELECT animal.ID, breed.BreedName FROM animal LEFT JOIN breed ON animal.breedID=breed.ID WHERE animal.ID='7'; 

私は何をする必要があることもあり、私はで無残に失敗していますanimal.breed2IDのために参加することBreedNameを得る:以下は私がしようとしています何の簡素化概要です。品種名を簡単にコード化してアプリケーションに表示させることはできますが、これはデータベース内の品種名の変更、追加、削除には役立ちません。

答えて

38

ちょうどその同じテーブルに参加する別の操作を行います。

イワンは、より多くのあなたのテーブルのデザインを作ることであろうから学ぶために長期的な配慮やだけのものを設計し、あなたの現在のデータベースのためのあなたの問題を解決してきたが
SELECT animal.ID, breed1.BreedName as BreedName1, breed2.BreadName as BreadName2 
FROM animal 
    LEFT JOIN breed as breed1 ON animal.breedID=breed1.ID 
    LEFT JOIN breed as breed2 ON animal.breedID=breed2.ID 
WHERE animal.ID='7'; 
+0

ありがとうございます。それは計画どおりに明確になりました。私はbreed.AnimalName AS breedName1、breed.AnimalName as breedName2を行うだけでそれをやっていました。テーブルのエイリアシングを完全に逃した!もう一度おねがいします。これは、技術的なサイトで見たことのある最高のヘルプの一部です! – user1137376

+0

私はここにいます:D私はStarShip3000の投稿にも同意します。しかし、私は3つ以上の品種の犬は起こりませんと仮定。しかし、そうするならば、スターによって推奨される方法を取ることを確かめてください。 – kingdaemon

14

あなたが動物に品種を追加するたびに新しい結合を追加する必要がないように正規化されている必要はありません。このシンプルなデザインによって、実際にあなたの人生はより困難になりました。

エンティティで繰り返されるプロパティタイプが表示された場合、breedIDおよびbreed2IDでは、ほとんど稀ではないが腐ったもののにおいがするようになります。

理想的な設計では、以下を実行します。

1.あなたの品種をそのまま使用してください。

2.Make animalは動物のように見えます(animal_id、animal_name)。

3.新しいanimal_breedテーブルを追加します。これはanimal_breed(animal_breed_id、animal_id、breed_id)のようになります。 animal_bread_idがpkで、固有キーが(animal_id、breed_id)にあり、それぞれのテーブルを指す外部キーがあります。

このデザインでは、複数の品種を返すためにクエリを混乱させることなく、1つまたは複数の品種を指定することができます。余分な品種の動物がいるたびに、あなたの現在のデザインは悪夢になります。パフォーマンスを低下させ、メンテナンスを悪夢にさせ、その上に健全なデータベース設計ではない可能性があります。