2009-12-10 94 views
2

我希望你能帮助找到一个问题的答案,这个问题将成为工作中反复出现的主题。这涉及将数据从RDBMS表格非规范化为具有跨列重复组(共享域和含义)的平面文件格式。不幸的是这是不可避免的。关系数据到平面文件

这里是改造的一个非常简单的例子,我会要求:

 
     TABLE A        TABLE B 
------------------- 1 -> MANY  ---------------------------- 
    A_KEY FIELD_A      B_KEY A_KEY FIELD_B 
A_KEY_01 A_VALUE_01     B_KEY_01 A_KEY_01 B_VALUE_01 
A_KEY_02 A_VALUE_02     B_KEY_02 A_KEY_01 B_VALUE_02 
            B_KEY_03 A_KEY_02 B_VALUE_03 

这将成为:

 
A_KEY  FIELD_A  B_KEY1  FIELD_B1  B_KEY2  FIELD_B2 
A_KEY_01 A_VALUE_01 B_KEY_01 B_VALUE_01 B_KEY_02 B_VALUE_02 
A_KEY_02 A_VALUE_02 B_KEY_03 B_VALUE_03 

TABLE A每个入口都会有一行与一个输出平面文件每个相关字段的列数为TABLE B。输出文件中的列可以具有从TABLE B获得的字段的空值。

我意识到这将创建一个非常文件,但这是一个要求。我看了一下MapForce和Apatar,但我认为这个问题太奇怪了,或者我不能正确使用它们。

我的问题:是否已经有一个工具可以完成这个工作,或者我应该从头开始开发一个工具(我不想重新发明车轮)?

+0

这是标准“表中的行到结果中的列”问题?这并不奇怪,这很常见。在SO和Google上搜索“表格行到结果列”。根据您阅读的内容更新此问题。 – 2009-12-10 11:51:34

+0

谢谢,我周围环顾四周,没有发现同样的问题 - 我可能只是没有说清楚。我会考虑如何让这个问题的微妙之处更加明显。 – Anthony 2009-12-10 13:20:26

回答

0

感谢您的帮助。因为它原来的关系是ONE - > 3 MAX和这个约束不会因为数据更改为现在静态的,所以以下运行的设施,工厂SQL工作:

 
select A.A_KEY, A.FIELD_A, B.B_KEY, B.FIELD_B, B2.B_KEY, B2.FIELD_B, B3.B_KEY, 
B3.FIELD_B 

from 

A left join B on (A.A_KEY = B.A_KEY) 
left join B B2 on (A.A_KEY = B2.A_KEY and B2.B_KEY != B.B_KEY) 
left join B B3 on (A.A_KEY = B3.A_KEY and B3.B_KEY != B.B_KEY 
        and B3.B_KEY != B2.B_KEY) 

group by A.A_KEY 
order by A.A_KEY 
0

我敢肯定,你不能在普通的SQL中解决这个问题,但取决于你的RDBMS,有可能创建一个存储过程或一些这样的事情。否则,在脚本语言中执行相当容易。你在使用哪种技术?

+0

对于RDBMS,解决方案必须尽可能与技术无关。我可以编写代码而无需将我的代码耦合到数据库供应商。它开始看起来像一些解决方案几乎在那里,但不是所有的方式。 – Anthony 2009-12-10 13:24:24

+0

在这种情况下,您可以使用通用脚本语言,如Python或类似语言。这可能是20行代码。 – troelskn 2009-12-10 15:02:57