2012-05-25 46 views
3

我正在使用Oracle SQL,因此外連接具有nice(+)語法。我應該警告你,我不允許重新設計數據庫;我爲一個大型組織工作。在Oracle中使用IN運算符進行外連接的解決方法

下面是一些例子表:

People 
PersonID Name 
1   Elmo 
2   Oscar 
3   Chris 

Attribute 
PersonID Attribute 
1   Happy 
1   Muppet 
1   Popular 
2   Grouchy 
2   Muppet 
2   Popular 
3   Programmer 

我想要的人的名單,我想知道我們是否讓他們快樂或鬱悶不已的知識。以下是輸出我想:

Name  Mood 
Elmo  Happy 
Oscar  Grouchy 
Chris 

因此,這裏是我想我會使用查詢:

SELECT p.Name, a.Attribute 
FROM People p, Attributes a 
WHERE p.PersonID = a.PersonID (+) 
AND (a.Attribute (+) = 'Happy' 
    OR a.Attribute (+) = 'Grouchy') 

(也許我將不得不把 「OR a.Attribute IS NULL」 什麼)

但實際上我不允許在外連接中使用OR!我應該怎麼做呢?

+2

你的查詢對我來說工作得很好:http://www.sqlfiddle.com/#!4/14c50/1 – mellamokb

+0

@mellamokb這真的很棒,但也許和我使用的版本不一樣。這裏是我的錯誤:例外:DBD,ORA-01719:OR或IN的操作數中不允許使用外連接運算符(+)狀態:N/A –

回答

8

首先,爲什麼你不能使用正確的OUTER JOIN ?,你可以在Oracle中使用它們,而不必使用(+)語法進行隱式連接。至於你的問題,你可以使用IN

SELECT p.Name, a.Attribute 
FROM People p 
LEFT OUTER JOIN Attributes a 
ON p.PersonID = a.PersonID AND a.Attribute IN ('Happy','Grouchy') 
+0

@ChrisCunningham - 並且在上面的查詢中拋出該錯誤?你使用的是什麼版本的Oracle? – Lamak

+0

這不起作用。你的迴歸將不會返回Chris,因爲在外部連接上返回的屬性將是「程序員」 - 不是null,不是Happy,而不是Grouchy。 –

+0

@ChrisCunningham - 真的嗎?,你是否先試過?因爲我相當確定它的工作原理 – Lamak

0

對不起回答我自己的問題。爲了避免錯誤ORA-01719,我改變了一切,以「適當」在@Lamak的意見加入,然後用此溶液去:

SELECT p.Name, a.Attribute 
FROM People p 
LEFT OUTER JOIN (SELECT PersonID, Attribute 
        FROM Attributes 
        WHERE Attribute = 'Happy' OR Attribute = 'Grouchy') a 
ON (p.PersonID = a.PersonID) 
1

如果你真的知道一個「正確」的ORACEL SQL語法Oracle數據庫,你也可以做到這一點...

SELECT p.Name, 
     a.Attribute 
    FROM people p, 
     (SELECT PersonID, 
       Attribute 
      FROM attributes 
       WHERE Attribute = 'Happy' 
       OR Attribute = 'Grouchy') a 
    WHERE p.personid = a.personid(+) 

點在於ANSI VS甲骨文語法是一個荒謬的評論。 Oracle支持這兩種,您可以更輕鬆/更好/易於管理。