来自多个表的oracle数据

Posted

技术标签:

【中文标题】来自多个表的oracle数据【英文标题】:oracle data from multiple tables 【发布时间】:2011-11-09 21:39:06 【问题描述】:

*更新

我将尝试再次解释情况: 我有一个数据集市,其中包含所有客户和原始付款以及 yyyymmdd 格式的状态和财政期间。状态需要与另一个表中的状态相匹配,以便我只获得那些客户名称和财政期间 status_datamart=status_table 和 status_table in ('inactive', 'active')。该数据现在被插入到一个名为“inv”的表中,其中包含: PORTFOLIO_INV, CLIENT_INV,ACCT_TYPE_INV,PERIOD,DESK,STATUS,PRIOR_OCA_CALC,PRINCIPAL,CUR_BAL

第二个数据集市再次包含客户、会计期间、付款(总额和净额)、交易类型。 一个查询仅用于从此数据集市中获取 txn 类型与另一个表匹配且 txn 类别为“总”的记录。 第二个查询具有与上述相同的过滤器,只有 txn 类别现在更改为“net”。

2 个查询得到总和净的原因是数据格式如下:

客户1 |财期|状态 |总的 客户2 |财期|状态 |总的 客户1 |财期|状态 |网 客户3 |财期|状态 |粗体

所以我使用查询一将总值存储到一个表“pmt”中: PORTFOLIO_PMT,CLIENT_PMT,ACCT_TYPE_PMT,PERIOD_PMT,DETAIL_TRANSACTION_TYPE,DETAIL_DESK_AT_PMT,DETAIL_STATUS_AT_PMT,PRIOR_OCA_CALC_PMT,DETAIL_AMOUNT_PMT

第二个查询存储到另一个表'net'中: PORTFOLIO_NET,CLIENT_NET,ACCT_TYPE_NET,PERIOD_NET,DETAIL_TRANSACTION_TYPE_NET,DETAIL_DESK_AT_PMT_NET,DETAIL_STATUS_AT_NET,PRIOR_OCA_CALC_NET,DETAIL_AMOUNT_NET

约束: client_inv=client_pmt=client_net period= period_pmt=period=net

希望对你有帮助……


我正在编写一个查询,该查询将从表 T1 中检索客户名称、财政年度和本金金额,从另一个表 T2(针对同一客户和同一会计期间)中检索总和(当前付款)以及从表 T1 中检索总和(净额)第三张表(与 T1 和 T2 相同的客户端)。 T1 中大约 3400 条记录、T2 中 939 条和 T3 中 103 条的查询耗时 2132.78 秒。

有没有一种方法可以让我不能使用连接而只是快速获取我想要的数据? 每个表中的记录总数会有所不同,具体取决于本金金额和已收到的付款数量。

【问题讨论】:

@joiner - 除了查询之外还发布查询计划。当您谈论“T1 中的 3400 条记录”时,您是说 T1 中总共有 3400 行吗?或者您只从 T1 检索 3400 行?如果您的意思是您只检索 3400 行,那么 T1 中有多少行您没有检索(T2 和 T3 也是如此)? 此时t1中有3400行。并根据客户名称和期间加入所有这些记录 【参考方案1】:

您是否尝试过分析查询缓慢的原因?

看起来您不必使用连接,而是所有三个查询的联合。它看起来像独立的功能。

当您有一个名为contact 的表和另一个名为contact_address 的表(其中包含与主表相关的信息)时,您需要使用联接。

如果您的信息不相关,那么您可以通过结果结构相同的联合获得结果。

【讨论】:

我使用了 UNION 但结果只有客户名称、期间和 sum(principal),它省略了 sum(payments) 和 sum(net) select client0, period0, sum(principal) from temp_inv group by client0, period0 union select client_pmt, period1, sum(detail_amount_pmt) from temp_pmt group by client_pmt, period1 union select client_net, period2, sum(detail_amount_net ) 来自 temp_pmt_net 组 by client_net, period2【参考方案2】:

您建议的数据量为 2132 秒似乎表明连接条件可能不准确,您可能会在执行计划中看到 MERGE JOIN CARTESIAN。 如果您要跟踪您的请求并发布 tkprof 输出,或者只是解释 SQL 并发布计划,这将有助于诊断问题。

【讨论】:

select client0, period0, sum(principal) from temp_inv group by client0, period0 union select client_pmt, period1, sum(detail_amount_pmt) from temp_pmt group by client_pmt, period1 union select client_net, period2, sum(detail_amount_net ) 来自 temp_pmt_net 组 by client_net, period2

以上是关于来自多个表的oracle数据的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL 显示来自同一个表的匹配数据

Oracle SQL:使用来自同一表的另一列的数据更新表

Oracle 基础——视图

oracle怎么用一个表的多个字段数据更新另一个表相应的字段中

Oracle SQL 查询从一行中的多个列中获取最新数据

来自托管数据访问的具有多个数组和标量的 Oracle 存储过程