2010-07-08 7 views
0

Je dois fusionner des données d'une table à une autre. Ces deux tableaux ont la même structure, quelque chose comme ceci:Fusionner des données d'une table à une autre avec FK

Id (PK*) | Name | ParetnId (FK to PK*, it's a tree) 

Ce que je suis en train d'utiliser:

  • Plaine insert/jour - trop long SQL, les problèmes FK/PK (quand je copie avec ligne ParentId de ne pas ligne existante)
  • de fusion opérateur - beaucoup plus courte, mais les mêmes problèmes

Je sais que certains gars désactivent temporairement les contraintes, copient les données et réactivent les contraintes. Dans mon cas, j'essaie d'éviter cela. (Beaucoup de threads écrivent à ces tables, et je ne sais pas comment de tels trucs affectent les transactions)

Le problème est: comment fusionner (ou simplement copier) des enregistrements entre ces tables sans désactiver les contraintes.

Répondre

0

Je pourrais utiliser plus d'informations sur la table source. Je suppose qu'il n'aura pas la colonne de clé primaire. Si elle n'a pas la colonne clé étrangère, je suppose que vous pouvez rejoindre la table cible pour obtenir l'ID (si c'est le cas, vous pouvez éliminer les clauses AND EXISTS ci-dessous). Le seul problème est que vous devrez l'exécuter plusieurs fois jusqu'à ce qu'il n'y ait plus d'inserts.

MERGE INTO Target AS T 
    USING Source AS S 
    ON S.Name = T.Name 
    WHEN MATCHED AND EXISTS(
    SELECT * 
     FROM Target 
     WHERE Id = S.ParentID 
    ) THEN 
    UPDATE SET 
     ParentId = S.ParentID 
    WHEN NOT MATCHED BY TARGET AND EXISTS(
    SELECT * 
     FROM Target 
     WHERE Id = S.ParentID 
    ) THEN 
    INSERT VALUES(
     S.Name, 
     S.ParentID 
    ) 
Questions connexes