Postgres多个连接

时间:2012-01-08 18:10:45

标签: postgresql

这是一个postgres数据库。我试图从品种表中拉出狗品种名称(Cane Corso,Labrador等),根据动物表中的外键显示。我的问题是动物表有两个外键到这个单一的品种表,我不断收到我的查询错误。第一个品种名称将根据左连接返回,但第二个品牌名称无法显示,因为我已经有一个左连接。以下是我试图做的简要概述:

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,我很失败。我可以轻松地对品种名称进行硬编码并将其显示在应用程序中,但这不利于数据库中品种名称的更改,添加或删除。

2 个答案:

答案 0 :(得分:50)

在同一张桌子上再做一次连接:

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';

答案 1 :(得分:20)

虽然Ivan已经为您当前的数据库设计解决了您的问题,但长期考虑或仅仅是要学习的事情是让您的表设计更加规范化,以便每次添加品种时都必须添加新的连接对动物来说没有必要。通过这种简单的设计,你实际上使你的生活变得更加困难。

当您在实体上看到重复的属性类型时,在您的案例中,您应该开始闻到一些腐烂的东西,除了极少数情况。

在理想的设计下,您将执行以下操作。

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

这种设计允许给定的动物接受一种或多种品种,而不必弄乱您的查询以返回多个品种。每当你有一个额外品种的动物时,你当前的设计就变成了一场噩梦。它有可能扼杀性能并使维护成为一场噩梦,最重要的是它不是合理的数据库设计。

相关问题