2009-12-10 91 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