慢查询 - 选择不存在外来属性的行

时间:2017-02-16 17:44:12

标签: sql

我有一个Person表,以及一个包含Person,Type和PhoneNumber字段的Place表。我想找到Person表中没有家庭电话号码的所有条目。问题是,他们要么可能没有桌上的房子,要么他们可能有家,但没有家庭电话号码。 (一个人可以拥有任意数量的关联地点,因此我无法检查没有相关地点。)

我当前的查询类似于

SELECT ID from Person LEFT JOIN Place on Person.ID = Place.Person WHERE 
(Place.Type = 'home' AND Place.Phone IS NULL)
OR (NOT EXISTS 
     (SELECT * FROM Place where Person.ID = Place.Person and Place.Type= 'home'))

问题是子查询非常慢,因为它没有进行连接。如何通过在子查询中使用连接或通过其他技巧来提高性能?

2 个答案:

答案 0 :(得分:1)

简化为:

select id from person left join place on id = person
and type = 'home'
where phone is null

答案 1 :(得分:0)

试试这个:

SELECT ID 
from   Person 
       LEFT JOIN Place 
         on Person.ID = Place.Person 
         and Place.Type = 'home'
WHERE  Place.Phone IS NULL
       Or Place.Type Is NULL