SQL:結合を使用したデータのフィルタリングは悪いですか?

database postgresql sql
SQL:結合を使用したデータのフィルタリングは悪いですか?

たとえば、次の表があります。

animal
-----------------------
animal_id | animal_name
-----------------------

owners
-----------------------
owner_id | owner_name
-----------------------

owners_animals
--------------------
owner_id | animal_id
--------------------

所有者のいない動物を見つけたいので、クエリを実行します。

select animal_name
from (select * from animals) as a
    left join (select * from owners_animals) as o on (a.animal_id = o.animal_id)
where owner_id is NULL

結合を使用してデータをフィルタリングするこの方法は受け入れ可能で安全ですか? 同じスキーマで、同じ結果を得るためのより良い代替手段はありますか?

  4  1


ベストアンサー

Not Exists句を使用します。

Select animal_name
From animals as a
Where Not Exists(Select 1
                 From owners_animals oa
                 Where oa.animal_id = a.animal_id)

また、* owners_animals.animal_id *のインデックスを付けて、このフィルターをできるだけ速くします。

4


postgres固有のものが何もないと仮定すると(私はpostgresに精通していない)、以下の方が簡単です。

Select *
From animals a
    left outer join owners_animals oa On a.animal_id = oa.animal_id
Where oa.owner_id is NULL

2


「FROM(SELECT * FROM table)」を実行しないで、「FROM table」を実行してください。「LEFT JOIN」についても同様です。 あなたが書いたのは非常に冗長です

SELECT animal_name
FROM animals
LEFT JOIN owners_animals
  USING ( animal_id )
WHERE owner_id IS NULL;

そうは言っても、 owner_id IS NULL`フラグメントを保持するため、 NOT EXISTS() `オプションがよく好きです。

結合されたテーブルの `USING(foo)`は `foo = foo`と同じですが、結果セットに含まれるのはそのうちの1つだけです。

0


タイトルとURLをコピーしました