PostgreSQL - 加入3个表返回太多结果

时间:2014-04-07 17:35:25

标签: sql postgresql join

我有3张桌子:

Advancements
  id

Advancement_Requirements
  advancement_id,
  requirement_id

Requirements
  id
  description

我希望获得某个requirments.descriptions的所有advancement.id。我能够做到这一点,但我必须使用DISTINCT,我不想这样做。如果我不使用DISTINCT,我会获得结果的页面和页面。这是我正在运行的查询。请告诉我如何在没有DISTINCT的情况下获得我的结果。

select distinct(requirements.description)
from requirements 
   inner join advancement_requirements on requirements.requirement_id = advancement_requirements.requirement_id 
   inner join advancements on advancement_requirements.advancement_id = 1;

我做错了什么?

3 个答案:

答案 0 :(得分:1)

我不确定你想要完成什么,但我的猜测是你试图加入表格并且你有一个搜索条件。所以你应该这样做。

select 
requirements.description
from requirements 
inner join advancement_requirements on requirements.requirement_id = advancement_requirements.requirement_id 
inner join advancements on advancement_requirements.advancement_id = advancements.id
WHERE advancements.id = 1;

答案 1 :(得分:0)

您没有在关联中关联Advancements表,因此它只返回每个要求乘以Advancements寄存器的结果。

select requirements.description from requirements inner join advancement_requirements on requirements.requirement_id = advancement_requirements.requirement_id inner join advancements on advancement_requirements.advancement_id = advancements.id
where advancements.id = 1;

答案 2 :(得分:0)

如果您在UNIQUE PRIMARY KEY中有外键和(advancement_id, requirement_id)(或Advancement_Requirements)约束(这种n:m关系的典型布局),那么这个简单的查询不需要DISTINCT

SELECT r.description
FROM   requirements r
JOIN   advancement_requirements ar USING (requirement_id)
WHERE  ar.advancement_id = 1;

或者您的问题中缺少信息。