例如,我有以下表格:
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
这种使用可接受且安全的连接过滤数据的方法吗?使用相同的模式,是否有更好的替代方法可以获得相同的结果?
答案 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
相同,但其中只有一个将在结果集中。