PL / SQL - 使用不相关的行加入子表

时间:2012-09-06 21:22:38

标签: sql join plsql

我正在尝试在PL / SQL中执行连接以获取父级列表 具有多个子表的记录作为单个查询的一部分返回。 我不是Oracle专家。如果我写了这样的查询:

SELECT PEOPLE.PersonName, JOBS.JobName, CREDENTIALS.CredentialName 
  FROM PEOPLE
  LEFT OUTER JOIN JOBS
    ON PEOPLE.PersonName = JOBS.PersonName
  LEFT OUTER JOIN CREDENTIALS
    ON PEOPLE.PersonName = CREDENTIALS.PersonName
  WHERE PEOPLE.PersonName = 'James'

我会得到一张桌子,列出了每一个组合 工作和凭证如此:

RN PERSON    JOB         CREDENTIAL
1  James     Developer   MBA
2  James     Developer   PhD
3  James     Developer   MCAD
4  James     QA          MBA
5  James     QA          PhD
6  James     QA          MCAD

那很好,而且你究竟如何期待一个左外圈 加入工作。但我需要的是JOB和 CREDENTIAL列只列出每个元素一次 彼此无关 - 但仍然列出詹姆斯' 子记录在PERSON所在的行上,并且仅在其上 詹姆斯。

RN PERSON    JOB         CREDENTIAL
1  James     Developer   MBA
2  James     QA          PhD
3  James     (null)      MCAD

但我不确定如何写这个连接。 (该 想法是C#代码将采取查询结果 并将其转换为一个父PERSON对象 两个子JOB对象的引用列表和 三个孩子的CREDENTIAL对象。

在这个例子之外,实际上是 两张以上的儿童餐桌,所以我不能 过滤结果集,这是所有的产物 儿童组合;我需要列 是不相关的名单。

我愿意用毛茸茸的SQL来实现 这个,但它需要是一个查询,而不是 多个查询与结果相结合 C#方面。

感谢任何可以提供帮助的人!

1 个答案:

答案 0 :(得分:0)

您需要枚举每个列表,然后使用它进行加入:

select p.PersonName, j.JobName, c.CredentialName
from Person p left outer join
     (select j.*,
             row_number() over (partition by PersonName order by jobname) as seqnum
      from jobs
     ) j
     on p.PersonName = j.PersonName full outer join
     (select c.*,
             row_number() over (partition by PersonName order by CredentialName) as seqnum
      from Credentials
     ) c
     on p.PersonName = c.PersonName and
        j.seqnum = c.seqnum
WHERE p.PersonName = 'James'

此查询正在做更多工作,因为它为所有人分配了seqnum。如果您实际上一次只选择一个人,可以将WHERE子句放在子查询中以使其更有效。

相关问题