其他方式进行此查询?

时间:2011-02-02 19:35:30

标签: sql database oracle

我有以下表格:

Animals (animal_id, producer_id, ...)
Producers (prod_id, ...)
BoughtAnimals (animal_id (fk), ...)

我想询问每个制作人,他们有多少动物,以及购买了多少动物。经过深思熟虑后,我尝试了以下方法:

select Producers.name, count (distinct A1.animal_id), count(distinct BoughtAnimals.animal_id)
from Producers, Animals A1, Animals A2, BoughtAnimals
where
  Producers.nif = A1.producer_id and
  Producers.nif = A2.producer_id and
  BoughtAnimals.animal_id = A2.animal_id
group by Producers.name;

但我只是通过反复试验才做到这一点,而且我发现很难一次推理几张动物表。有没有其他方法来进行此查询?或者这是通常的做法吗?

3 个答案:

答案 0 :(得分:3)

尝试这样的事情

select p.name,
    sum(case when ba.anyfield is not null then 1 else 0 end) bought_count,
    count(1) total_count
from Producers p join Animals a on (p.nif = a.producer_id)
    left join BoughtAnimals ba using (animal_id)
group by p.name;

答案 1 :(得分:1)

使用简单的JOIN,然后可以将“COUNT”放在HAVING语句中。请参阅LEFT / INNER JOIN和HAVING的文档,具体取决于您的SGDB。

答案 2 :(得分:0)

我现在忽略了制作人表;您需要的所有关键数据都在另外两个表中。一旦这部分是正确的,你可以在producer表上进行内部联接,以获得你需要的其他细节。

select a1.producer_id, 
       count(a1.animal_id) as num_animals, 
       count(b1.animal_id) as num_bought
from animals a1
left join boughtanimals b1 on (b1.animal_id = a1.animal_id)
group by producer_id;

我不清楚最后一栏是否更好地命名为“num_bought”或“num_sold”。同样不清楚的是生产者“拥有”动物是什么意思,因为有些动物是买卖的。