2017-02-16 35 views
0

我有一個Person表和一個Place表,其中包含Person,Type和PhoneNumber字段。我想查找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')) 

的問題是,子查詢因爲它沒有進行連接,所以非常慢。如何通過在子查詢中使用連接或其他技巧來提高性能?

+0

什麼是你的表的模式?你在使用SQL Server,MySQL,Oracle等嗎? – ryanlutgen

回答

1

它簡化爲:

select id from person left join place on id = person 
and type = 'home' 
where phone is null 
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 
+0

雖然從Person到Place有一對多的關係。我會將其添加到問題中。 –

+0

過濾器類型爲null是不必要的 –

+0

@DanBracuk - 在閱讀您的回覆後,我發現您說得對。但是,它仍然認爲值得根據桌面上可能存在或不存在的索引進行嘗試。 –