Dados Relacionais de arquivo simples
-
18-09-2019 - |
Pergunta
Eu espero que você pode ajudar a encontrar uma resposta para um problema que se tornará um tema recorrente no trabalho. Isso envolve desnormalizar dados de tabelas de RDBMS para formatos de arquivo plano com grupos de repetição (partilha de domínio e significado) através de colunas. Infelizmente isso é inevitável.
Aqui está um exemplo muito simplificado da transformação eu exigem:
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
Este será:
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
Cada entrada de TABLE A
terá uma linha no arquivo simples de saída com uma coluna por área relacionada a partir TABLE B
. Colunas no arquivo de saída pode ter valores vazios para campos obtidos a partir TABLE B
.
Eu percebo isso vai criar um extremamente de largura de arquivo, mas este é um requisito. Eu tive uma olhada MapForce e Apatar, mas acho que este problema é muito bizarro ou eu não posso usá-los corretamente.
A minha pergunta: já existe uma ferramenta que vai conseguir isso ou eu deveria desenvolver a partir do zero (eu não quero reinventar a roda)
?Solução 3
Obrigado por toda sua ajuda. Como se vê a relação é ONE -> MAX de 3 e esta restrição não irá mudar à medida que os dados são agora estático para os seguintes trabalhos SQL run-of-the-mill:
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
Outras dicas
Eu tenho certeza que você não pode resolver isso no SQL simples, mas dependendo do seu RDBMS, pode ser possível criar um procedimento armazenado ou alguma coisa assim. Caso contrário, é uma coisa bastante fácil de fazer em uma linguagem de script. Qual tecnologia você está usando?
Será que isso ajuda?