Oracle LEFT OUTER JOIN出现问题



在我们的程序中,表"Person"和表"Phonem"之间存在多对多关系。这是由一个联接表"PersonPhon"归档的。

人员:

PERSID 
NAME
FIRSTNAME
DATEOFBIRTH
TYPE
[...]

PersonPhon:

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

电话:

PHONID
PHONEM

由于一个错误,一些最近的Person被持久化,没有引用他们各自的Phonem条目。为了从数据库中读取它们,我创建了一个语句:

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

这句话的目的是给我所有在PersonPhon中没有相应条目的人,并且,对于测试数据(只有没有PersonPhon条目的人),这很好。然而,如果PersonPhon条目,该语句也会选择Person,所以我想我的语句有一个错误,但我无法找出问题所在。

编辑:

条目:

人员表

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    

电话表

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

根据上述数据,该声明给出:

76257713 
76257713 
76257714 

这是意外的行为。预期仅为76257714

如果PersonPhonem表为空,则会给出:

76257713 
76257714 

哪个看起来像预期的行为,但似乎具有误导性。

如果您试图在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>>

最新更新