从多个表中检索数据并将它们存储在面对重复项的一个表中

时间:2012-11-06 21:19:59

标签: sql-server database data-warehouse

我正在研究一些关键数据检索报告任务并发现一些困难 继续。基本上,它属于医疗领域,整个数据分布在 几个表我无法改变数据库表设计的架构。为了 完成我的报告,我需要以下步骤:

1- divide the whole report to several parts, for each parts retrieve data by using
several joins. (like for part A can be retrieved by this:
select a1.field1, a2.field2 from a1 left join a2 on a1.fieldA= a2.fieldA ) then I can
got all the data from part A.

2- the same things happened for part B
select b1.field1, b2.field2 from b1 left join b2 on b1.fieldB= b2.fieldB, then I also
get all the data from part B.

3- same case for part C, part D.....and so on.

我划分它们的原因是,对于每个部分,我需要有超过8个连接(医疗数据总是复杂的)所以我无法在一个连接中完成所有这些连接(超过50个连接,这是不可能的完成...)

之后,我运行我的Spring Batch程序,将来自A部分的所有数据和部分b,部分c ...中的数据作为我的最终报告表插入到一个表中。问题不是每个部分都有相同的行数,这意味着部分A可能返回10行,而部分b可能返回20行。由于每个部分的时间条件相同(1天)并且无法更改,因此只是想知道如何以最小的开销将所有这些不同的数据部分存储到一个表中。我不想要多次重复,谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

在我看来,你需要的是加入“来自A部分的数据”,“来自B部分的数据”和& “来自C部分的数据”。让我们称他们为da,db& DC。 da / b / c中的num行是完全不同的。但是当你试图将它们全部放在一张表中时,显然它们之间存在某种关系。如果没有对这种关系的更好描述,就不可能提供更具体的答案。所以我只会写下你可能已经知道的想法,但无论如何......

最简单的方法是在更高级别[外部]查询中加入3 [内部]查询的结果。

select j.x, j.y, j.z
from (
   ' da join db join dc
) j;

如果这不可能(由于你说的连接太多),那么试试其中一个:

  1. 创建3个单独的materialized views(da,db& dc各一个)并执行连接这些视图。 Materialized是可选的(即你也可以使用“普通”视图),但是如果在你的数据库中可用,它应该会大大提高性能。
  2. 首先运行da / b / c查询,获取数据并将此数据放入中间表中。在这些表上运行连接。
  3. PS:如果你想在某些数据上运行报告(许多/频繁/大尺寸),那么应该适当地设计这些数据,否则你将来会遇到麻烦。

    如果您想要更具体的内容,请发布da / b / c之间的关系。