2011-02-02 7 views
0

私は、次の表があります。このクエリを実行する他の方法はありますか?

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; 

が、私は唯一の試行錯誤によってそれをやった、と私はそれは難しい、一度に複数の動物のテーブルについて推論するために見つける:あまり考えた後、私は次のようなアプローチを試してみました。このクエリを作成する他の方法はありますか?それともこれが通常のやり方ですか?

+2

暗黙の構文の使用をやめ、結合について学ぶと、より良いクエリの実行方法を理解できます。 – HLGEM

答えて

1

単純なJOINを使用すると、 "COUNT"をHAVING文に入れることができます。 SGDBに応じてLEFT/INNER JOINとHAVINGのドキュメントを参照してください。

+0

私はHAVINGステートメントがこれの何かを助ける方法を理解していません。私が読んだことで、HAVINGステートメントは、返される行の量を制限する目的を果たしているようですが、それは私が探しているものではありません。 –

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

のようなものを試してみてください。必要なすべての重要なデータは、他の2つのテーブルにあります。この部分が正しければ、必要なその他の詳細を得るために、プロデューサテーブルに対して内部結合を行うだけで済みます。

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」という名前が良いかどうかはわかりません。また、いくつかの動物が買われているか売られていることを考えると、プロデューサーが動物を「持っている」ということは明確ではありません。

関連する問題