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