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)

?
Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top