SQL:使用连接过滤数据不好?

时间:2010-01-31 00:04:31

标签: sql database postgresql

例如,我有以下表格:

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 个答案:

答案 0 :(得分:4)

使用非Exists clause

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 索引,以尽快使此过滤器

答案 1 :(得分:2)

假设没有特定的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 :(得分:0)

不要做,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相同,但其中只有一个将在结果集中。