繁体   English   中英

Oracle LEFT OUTER JOIN的问题

[英]Trouble with Oracle LEFT OUTER JOIN

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

人:

PERSID 
NAME
FIRSTNAME
DATEOFBIRTH
TYPE
[...]

人Phon:

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

音素:

PHONID
PHONEM

由于存在错误,某些“最近的人员”被持久保存,而未引用其各自的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

人桌

PEPHPERSID | PEPHPHONID
76257713 | 21000
76257713 | 26000    

音位表

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

利用以上数据,该语句给出:

76257713 
76257713 
76257714 

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

如果PersonPhonem-Table为空,则给出:

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>>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM