2012-01-08 109 views
19

這是一個postgres數據庫。我試圖從品種表中拉出狗的品種名稱(Cane Corso,拉布拉多等),以根據位於動物表中的外鍵進行顯示。我的問題是動物表有兩個外鍵到這個單品種表,我不斷收到我的查詢錯誤。第一個品種名稱將基於左連接返回,但是第二個品種名稱不能顯示,因爲我已經有一個左連接。下面是什麼,我試圖做的簡化外形: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'; 

我需要做的是還獲得了BreedName加入了animal.breed2ID這我在慘遭失敗。我可以很容易地對品種名稱進行硬編碼並將其顯示在應用程序中,但這不利於數據庫中品種名稱的更改,添加或刪除。

回答

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

非常感謝你。澄清和完全按計劃運作!我只是做了一個品種而搞亂了它。動物名稱AS品種名稱1,品種。動物名稱AS品種名稱2。完全錯過了桌子的別名!再次感謝,這是我在科技網站上看到的最好的幫助! – user1137376 2012-01-08 18:42:42

+0

嘿沒問題,這就是爲什麼我們在這裏:D我也同意StarShip3000的職位。但我認爲有3個或更多品種的狗不會發生。但是,如果他們這樣做,那麼一定要採用Star推薦的方法。 – kingdaemon 2012-01-08 23:38:37

14

雖然伊萬已經解決您的問題,爲您的當前數據庫設計一個長遠的考慮,或只是一個東西從學習將讓你的表的設計更歸一化,以便每次你想添加一個品種到動物不得不添加一個新的加入是沒有必要的。通過這個簡單的設計,你實際上讓你的生活變得更加困難。

當你在一個實體上看到重複的屬性類型時,在你的例子中,你應該開始聞到一些爛東西,除了極少數情況。

在理想的設計下,您將執行以下操作。

1.照顧你的品種。

2.讓動物看起來像動物(animal_id,animal_name)。

3.添加一個新的animal_breed表。它看起來像這個animal_breed(animal_breed_id,animal_id,breed_id)。 animal_bread_id是一個pk和一個唯一的鍵(animal_id,breed_id),外鍵指向相應的表。

此設計允許給定的動物採取一個或多個品種類型,而無需混淆您的查詢以返回多個品種。每當你有一個額外的品種的動物,你目前的設計變成一場噩夢。它有可能會導致性能下降,並使維護成爲一場噩夢,而且最重要的還不是完善的數據庫設計。