平面文件的关系数据

时间:2009-12-10 11:46:38

标签: rdbms flat-file denormalization

我希望你能帮助找到一个问题的答案,这个问题将成为工作中反复出现的主题。这涉及将来自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,但我认为这个问题太奇怪了,或者我无法正确使用它们。

我的问题:是否已经有一个工具可以实现这个目标,或者我应该从头开发一个(我不想重新发明轮子)?

3 个答案:

答案 0 :(得分:0)

我很确定你无法在纯SQL中解决这个问题,但根据你的RDBMS,可能会创建一个存储过程或某些东西。否则,在脚本语言中这是一件相当容易的事情。您使用的是哪种技术?

答案 1 :(得分:0)

这有帮助吗?

using-pivot-in-sql-server-2008

答案 2 :(得分:0)

感谢您的帮助。事实证明这种关系是 ONE - > MAX为3 ,这个约束不会改变,因为数据现在是静态的,所以下面的普通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