创建 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 查询 - 使用默认值查看和联合的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE中创建如何创建表,并设置结构和默认值

Oracle ODI 12c之多表联合查询以及定时任务设置

如何修改oracle数据库查询的默认大小写状态

Oracle数据库-多表联合查询&子查询

oracle如何查看表对应的序列

用户的默认或临时表空间不存在 怎么解决