2

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

这是我需要的转换的一个非常简化的示例:

      表 A                               表 B
------------------- 1 -> 许多 --------------- -
  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,但我认为这个问题太奇怪了,或者我无法正确使用它们。

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

4

3 回答 3

0

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

于 2009-12-10T11:49:57.950 回答
0

这有帮助吗?

使用-pivot-in-sql-server-2008

于 2009-12-10T11:55:26.180 回答
0

感谢你的帮助。事实证明,关系是ONE -> MAX of 3,并且此约束不会改变,因为数据现在是静态的,因此以下普通 SQL 起作用:

选择 A.A_KEY、A.FIELD_A、B.B_KEY、B.FIELD_B、B2.B_KEY、B2.FIELD_B、B3.B_KEY、
B3.FIELD_B

从

 A 左连接 B on (A.A_KEY = B.A_KEY)
在(A.A_KEY = B2.A_KEY 和 B2.B_KEY != B.B_KEY)上左加入 B B2
在 (A.A_KEY = B3.A_KEY 和 B3.B_KEY != B.B_KEY 上左加入 B B3
                   和 B3.B_KEY != B2.B_KEY)

按 A.A_KEY 分组
由 A.A_KEY 订购
于 2009-12-15T11:57:25.570 回答