2012-01-08 86 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),外键指向相应的表。

此设计允许给定的动物采取一个或多个品种类型,而无需混淆您的查询以返回多个品种。每当你有一个额外的品种的动物,你目前的设计变成一场噩梦。它有可能会导致性能下降,并使维护成为一场噩梦,而且最重要的还不是完善的数据库设计。