SQL: Фильтрация данных с помощью объединения это плохо? - PullRequest
4 голосов
/ 31 января 2010

Например, у меня есть следующие таблицы:

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

Является ли этот способ фильтрации данных с использованием объединения приемлемым и безопасным? С такой же схемой, есть ли лучшая альтернатива для получения того же результата?

Ответы [ 3 ]

4 голосов
/ 31 января 2010

Использовать условие 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 , чтобы сделать этот фильтр максимально быстрым

2 голосов
/ 31 января 2010

Если предположить, что нет ничего специфического для 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
0 голосов
/ 31 января 2010

Никогда не делай, 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;

С учетом вышесказанного мне часто нравится опция NOT EXISTS(), потому что она удерживает фрагмент owner_id IS NULL.

USING (foo) совпадает с foo = foo в объединенных таблицах, за исключением того, что только один из них будет в наборе результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...