【问题标题】:Workaround for outer join with an IN operator in Oracle在 Oracle 中使用 IN 运算符进行外部联接的解决方法
【发布时间】:2012-05-25 17:00:51
【问题描述】:

我使用的是 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!我应该怎么做呢?

【问题讨论】:

  • 您的查询对我来说效果很好:sqlfiddle.com/#!4/14c50/1
  • @mellamokb 这太棒了,但也许这与我使用的版本不同。这是我的错误:异常:DBD,ORA-01719:OR 或 IN 的操作数中不允许外连接运算符 (+) 状态:N/A

标签: sql oracle outer-join


【解决方案1】:

首先,您为什么不能使用正确的OUTER JOINs?,您可以在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')

【讨论】:

  • @ChrisCunningham - 它在上面的查询中抛出了那个错误?您使用的是什么版本的 Oracle?
  • 这不起作用。你的不会返回 Chris,因为将在外部连接上返回的 Attribute 将是“Programmer”——不是 null、不是 Happy,也不是 Grouchy。
  • @ChrisCunningham - 真的吗?你先试过了吗?因为我很确定它有效
  • Chris 将与 Programmer 配对,因此他的属性既不是 Happy 也不是 Grouchy。是的,我试过了。
  • @ChrisCunningham 你不应该改变 Lamaks 查询 - 外连接过滤应该在 ON 子句中完成。
【解决方案2】:

如果您真的了解“正确”Oracle 数据库的 Oracle 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 支持这两种方式,无论哪种方式对您来说更容易/更好/易于管理。

【讨论】:

    【解决方案3】:

    很抱歉回答我自己的问题。为避免 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-21
      • 1970-01-01
      相关资源
      最近更新 更多