Postgres多个连接

use*_*376 32 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';
Run Code Online (Sandbox Code Playgroud)

我需要做的是让BreedName加入animal.breed2ID,我很失败.我可以轻松地对品种名称进行硬编码并将其显示在应用程序中,但这不利于数据库中品种名称的更改,添加或删除.

小智 62

只需在同一个表上进行另一次连接:

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';
Run Code Online (Sandbox Code Playgroud)


Kub*_*aun 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),外键指向相应的表.

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