创建 ORACLE 查询 - 使用默认值查看和联合
Posted
技术标签:
【中文标题】创建 ORACLE 查询 - 使用默认值查看和联合【英文标题】:Create an ORACLE query - View and union with default value 【发布时间】:2015-01-28 14:03:28 【问题描述】:出于特定需求,我想通过合并多个表中的数据并默认添加数据来创建视图。
更多细节:
我的数据库中有 3 个表:
合同表(id_contract,名称)
表投资组合(id_pfo,标签)
链接表“contract_Linked_pfo”(id_contract、id_pfo、预算)
对于每个合同,可以添加一个或多个具有特定预算的投资组合(在链接表中可见)。
合约(来自合约表)可能不包含投资组合。因此,链接表中不存在此合同
我需要创建一个视图以生成包含以下内容的表:
链接表中的行和链接到所有投资组合的所有行(对于其他合约)以获得例如:
链接表中的行
id_contract: 1 - id_portfolio: 1 - value:500
id_contract: 1 - id_portfolio: 2 - value:1500
id_contract: 2 - id_portfolio: 1 - value:1000
id_contract: 2 - id_portfolio: 2 - value:3000
id_contract: 3 - id_portfolio: 1 - value:5000
还有其他案例的行
id_contract: 3 - id_portfolio: 2 - value:0
id_contract: 4 - id_portfolio: 1 - value:0
id_contract: 4 - id_portfolio: 2 - value:0
id_contract: 5 - id_portfolio: 1 - value:0
id_contract: 5 - id_portfolio: 2 - value:0
我不知道如何在 oracle 中编写它。 我知道创建视图的代码和查询的第一步。在我认为我必须对查询的第二部分进行 UNION 之后。
不过我不知道第二部分该怎么做(为每个投资组合的链接表中不存在的每个合同添加行,预算默认值为 0)
你能帮我做吗?
非常感谢,
赛博
【问题讨论】:
【参考方案1】:如果我理解正确,您想要合约和投资组合的所有组合,无论该组合是否存在于链接表中?如果链接表中存在该组合,则显示链接中的预算值,否则显示为零作为预算值?
然后你可以代替UNION ALL
使用CROSS JOIN
来获取所有可能的组合,然后你LEFT OUTER JOIN
到链接表。像这样的:
select c.id_contract
, p.id_pfo
, nvl(l.budget,0) value
from contracts c
cross join portfolios p
left outer join "contract_Linked_pfo" l
on l.id_contract = c.id_contract
and l.id_pfo = p.id_pfo
;
(我假设您的链接表是混合大小写标识符,因为您在问题中这样写。如果不是这样,请删除引号 ;-)
【讨论】:
非常感谢您的回复和帮助 :-) 。查询有效,但我有双重结果。我想从链接表和所有其他行(合同表和投资组合表之间的组合)中获取所有行,并且没有双行。因此,如果链接表中存在一行,则不应以双精度形式检索它。如果喜欢的表中不存在该行,则应将预算设置为 0。 “双检索”是什么意思?如果我的回答不符合您的要求,那我恐怕不明白您的意思?您显示的示例数据是合同表中的 5 行(id 1 到 5)和投资组合表中的 2 行(id 1 到 2)。您想要的输出显示 10 行(可能的 5 * 2 组合),其中 5 行预算显示在链接表中,其中 5 行在链接表中不存在,因此给出 0 预算。因此,对于合同中的 5 行、投资组合中的 2 行、链接表中的 5 行,所需的输出 10 行,我的查询会给出结果,不是吗? 您的意思是,对于 (id_contract,id_pfo) 的相同组合,您可以在链接表中拥有多行?如果是这样,那么在这些情况下你想要什么预算?链接线的总和?最大值? 好吧,你说的没错。我实际上忘记更新您的查询的一部分。非常感谢您的帮助以上是关于创建 ORACLE 查询 - 使用默认值查看和联合的主要内容,如果未能解决你的问题,请参考以下文章