Reputation: 1876
I am using Oracle SQL, so outer joins have the nice (+) syntax. I should warn you that I am not allowed to redesign the database; I work for a large organization.
Here are some example tables:
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
I want a list of people and I want to know whether we have knowledge of them being happy or grouchy. The following is the output I want:
Name Mood
Elmo Happy
Oscar Grouchy
Chris
So here is the query I thought I would use:
SELECT p.Name, a.Attribute
FROM People p, Attributes a
WHERE p.PersonID = a.PersonID (+)
AND ( a.Attribute (+) = 'Happy'
OR a.Attribute (+) = 'Grouchy' )
(Perhaps I would have to put "OR a.Attribute IS NULL" or something.)
But in fact I'm not allowed to use OR inside an outer join at all! What should I actually do instead?
Upvotes: 4
Views: 19332
Reputation: 21
If you really know the Oracel SQL syntax for a "proper" Oracle database, you could also do this...
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(+)
The point being that ANSI vs Oracle syntax is a ridiculous comment. Oracle supports both, you whichever is easier/better/manageable for you.
Upvotes: 2
Reputation: 1876
Sorry to answer my own question. To avoid the error ORA-01719, I changed everything to "proper" joins at the advice of @Lamak, and then went with this solution:
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)
Upvotes: 0
Reputation: 70638
First of all, why can't you use proper OUTER JOIN
s?, you can use them in Oracle without having to do the implicit joins with the (+)
syntax. As for your problem, you can use 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')
Upvotes: 8