我希望你能帮助找到一个问题的答案,这个问题将成为工作中反复出现的主题。这涉及将来自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 :(得分:0)
我很确定你无法在纯SQL中解决这个问题,但根据你的RDBMS,可能会创建一个存储过程或某些东西。否则,在脚本语言中这是一件相当容易的事情。您使用的是哪种技术?
答案 1 :(得分:0)
答案 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