我正在尝试在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#方面。
感谢任何可以提供帮助的人!
答案 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子句放在子查询中以使其更有效。