我正在使用Oracle SQL,因此外连接具有良好的(+)语法。我应该警告你,我不能重新设计数据库;我在一个大型组织工作。
以下是一些示例表:
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!我该怎么做呢?
答案 0 :(得分: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')
答案 1 :(得分:2)
如果你真的知道“适当的”Oracle数据库的Oracel SQL语法,你也可以这样做......
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语法是一个荒谬的评论。 Oracle支持两者,无论哪种更容易/更好/可管理。
答案 2 :(得分: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)