2009-12-10 9 views
2

J'espère que vous pouvez aider à trouver une réponse à un problème qui deviendra un thème récurrent au travail. Cela implique la dénormalisation des données des tables RDBMS vers des formats de fichiers plats avec des groupes récurrents (partage de domaine et de sens) entre les colonnes. Malheureusement, c'est inévitable.Données relationnelles au fichier plat

Voici un exemple très simplifié de la transformation je requiers:

 
     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 

Cela deviendra:

 
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 

Chaque entrée de TABLE A aura une ligne dans le fichier plat de sortie avec un colonne par domaine apparenté de TABLE B. Les colonnes du fichier de sortie peuvent avoir des valeurs vides pour les champs obtenus à partir de TABLE B.

Je me rends compte que cela va créer un fichier large, mais c'est une exigence. J'ai jeté un oeil à MapForce et à Apatar, mais je pense que ce problème est trop bizarre ou que je ne peux pas les utiliser correctement.

Ma question: existe-t-il déjà un outil qui permettra d'atteindre cet objectif ou devrais-je en développer un à partir de zéro (je ne veux pas réinventer la roue)?

+0

Est-ce la norme "lignes dans la table à colonnes dans le résultat" question? Ce n'est pas bizarre, c'est commun. Recherche de "lignes de table à colonnes de résultat" ici sur SO et Google. Mettez à jour ceci avec des questions spécifiques basées sur ce que vous avez lu. –

+0

Merci, j'ai jeté un bon coup d'œil et je n'ai pas trouvé le même problème - je ne suis probablement pas clair. Je réfléchirai à la façon dont je peux rendre la subtilité de cette question plus évidente. – Anthony

Répondre

0

Merci pour votre aide. Il se trouve que la relation est ONE -> MAX de 3 et cette contrainte ne changera pas que les données sont maintenant statique pour ce qui suit au fil de l'usine-SQL fonctionne:

 
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

Je suis sûr que vous ne pouvez pas résoudre cela en langage SQL, mais en fonction de votre SGBDR, il peut être possible de créer une procédure stockée ou quelque chose de ce genre. Sinon, c'est une chose assez facile à faire dans un langage de script. Quelle technologie utilisez-vous?

+0

Pour le SGBDR, la solution doit être aussi agnostique que possible. Je peux coder ceci sans coupler mon code à un fournisseur de base de données. Il commence à sembler que certaines solutions sont presque là, mais pas tout le temps. – Anthony

+0

Dans ce cas, vous pouvez utiliser un langage de script générique, tel que Python ou similaire. C'est probablement quelque chose comme 20 lignes de code. – troelskn

Questions connexes