繁体   English   中英

PL / SQL —连接具有不相关行的子表

[英]PL/SQL — Join Child Tables With Unrelated Rows

我试图在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列仅列出每个元素一次并且彼此不相关-但仍将James的子记录仅在PERSON是James的行上列出。

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

但是我不确定如何编写此联接。 (其想法是C#代码将获取查询结果并将其转换为一个父PERSON对象,其中包含对两个子JOB对象和三个子CREDENTIAL对象的引用列表。

但是,在此示例之外,实际上有两个以上的子表,因此我无法筛选出所有子组合的结果集; 我需要这些列是不相关的列表。

我愿意处理冗长的SQL以实现这一点,但是它必须是一个查询,而不是多个查询,并且在C#端组合了结果。

感谢任何能提供帮助的人!

您需要枚举每个列表,然后将其用于加入:

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子句放在子查询中以使其更有效率。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM