English 中文(简体)
在Oracle中使用IN运算符解决外部连接问题
原标题:Workaround for outer join with an IN operator in Oracle

我使用的是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.属性为空”之类的。)

但事实上,我根本不允许在外部连接中使用OR!我实际上应该做什么?

最佳回答

首先,为什么不能使用正确的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 )
问题回答

如果你真的知道“正确”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与Oracle语法是一个荒谬的评论。Oracle支持这两者,无论哪一个对你来说更容易/更好/更易于管理。

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




相关问题
Export tables from SQL Server to be imported to Oracle 10g

I m trying to export some tables from SQL Server 2005 and then create those tables and populate them in Oracle. I have about 10 tables, varying from 4 columns up to 25. I m not using any constraints/...

Connecting to Oracle 10g with ODBC from Excel VBA

The following code works. the connection opens fine but recordset.recordCount always returns -1 when there is data in the table. ANd If I try to call any methods/properties on recordset it crashes ...

How to make a one to one left outer join?

I was wondering, is there a way to make a kind of one to one left outer join: I need a join that matches say table A with table B, for each record on table A it must search for its pair on table B, ...

Insert if not exists Oracle

I need to be able to run an Oracle query which goes to insert a number of rows, but it also checks to see if a primary key exists and if it does, then it skips that insert. Something like: INSERT ALL ...

How can I store NULLs in NOT NULL field?

I just came across NULL values in NOT-NULL fields in our test database. How could they get there? I know that NOT-NULL constraints can be altered with NOVALIDATE clause, but that would change table s ...

Type reference scope

I m studying databases and am currently working on a object-relational DB project and I ve encountered a small problem with the number of possible constraints in an object table. I m using "Database ...

OracleParameter and DBNull.Value

we have a table in an Oracle Database which contains a column with the type Char(3 Byte). Now we use a parameterized sql to select some rows with a DBNull.Value and it doesn t work: OracleCommand ...

热门标签