2015-12-01 37 views
0

在我們的程序中,我們在表'Person'和表'Phonem'之間建立了多對多關係。這通過一個連接表'PersonPhon'來實現。Oracle與LEFT OUTER JOIN的故障

人:

PERSID 
NAME 
FIRSTNAME 
DATEOFBIRTH 
TYPE 
[...] 

PersonPhon:

PEPHPERSID <-- references the person 
PEPHPHONID <-- references the phonem 

Phonem:

PHONID 
PHONEM 

由於一個bug,最近的一些人是沒有各自Phonem條目的參考依然存在。爲了從數據庫中讀取它們,我創建了一個聲明:

select p.persid from  
Person p left outer join PersonPhon ph 
on p.persid = ph.pephpersid    
where p.type = 'natural' 

這種說法是爲了給我所有的人在PersonPhon沒有相應的條目,並且,與試驗數據(只是不PersonPhon條目人)這個作品好。然而,聲明還選擇人員,如果他們有PersonPhon項目,所以我想我的聲明有錯誤,但我無法弄清楚什麼是錯的。

編輯:

條目:

與人表

PERSID | NAME | FIRSTNAME | AGE | TYPE (other columns ommitted) 
76257713 | Wilko | Roger| 30 | natural 
76257714 | Martian | Marvin | 50 | natural 

PersonPhon-表

PEPHPERSID | PEPHPHONID 
76257713 | 21000 
76257713 | 26000  

Phonem-表

PHONID | PHONEM 
21000 | 4875122 
26000 | 7468112 
most entries omitted (> 100000) 

通過以上數據,該聲明得到:

76257713 
76257713 
76257714 

這是意外行爲。預計將只是76257714

如果PersonPhonem,表是空的,它提供了:

76257713 
76257714 

其中看起來像預期的行爲,但似乎是誤導。

+0

您可以發佈您的數據集和預期產出? – SriniV

+0

我也想看看WHERE子句。 – jarlh

+0

在where條款和信息中添加了疑問 – Scorpio

回答

2

如果您嘗試查找person中沒有其他表中的行的行,則聽起來您想要not exists而不是left outer join。你可以做一個left outer join,然後有一個where子句,看起來看到左連接表的值是null但通常不太可讀。

我的猜測是,你想

SELECT * 
    FROM person p 
WHERE NOT EXISTS(SELECT 1 
        FROM PersonPhon ph 
        WHERE p.persid = ph.pephpersid) 
    AND <<your additional predicates>>