Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment fusionner deux données de base de données identiques en une seule ?

Vous dites que les deux clients utilisent votre application, donc je suppose qu'il s'agit d'une sorte de logiciel "rétractable" qui est utilisé par plus de clients que ces deux-là, n'est-ce pas ?

Si oui, l'ajout de colonnes spéciales aux tables ou quelque chose comme ça causera probablement des problèmes à l'avenir, car vous devrez soit maintenir une version spéciale pour ces deux clients qui peut gérer les colonnes supplémentaires. Ou vous devrez introduire ces colonnes dans votre base de code principale, ce qui signifie que tous vos autres clients les obtiendront également.

Je peux penser à un moyen plus simple de le faire sans modifier aucune de vos tables ni ajouter de colonnes.
Pour que cela fonctionne, vous devez trouver le plus grand ID qui existe dans les deux bases de données ensemble ( peu importe dans quelle table ou dans quelle base de données il se trouve) .

Cela peut nécessiter un copier-coller pour obtenir un grand nombre de requêtes ressemblant à ceci :

select max(id) as maxlocationid from locations
select max(id) as maxpersonid from persons
-- and so on... (one query for each table)

Lorsque vous trouvez le plus grand ID après avoir exécuté la requête dans les deux bases de données, prenez un nombre supérieur à cet ID et ajoutez-le à tous les ID de toutes les tables de la seconde base de données.
Il est très important que le nombre doit être plus grand que le plus grand ID qui existe déjà dans les deux bases de données !

C'est un peu difficile à expliquer, alors voici un exemple :

Disons que le plus grand ID dans n'importe quelle table dans les deux bases de données est 8000 .
Ensuite, vous exécutez du SQL qui ajoute 10000 à chaque ID de chaque table de la seconde base de données :

update Locations set Id = Id + 10000
update Persons set Id = Id + 10000, LocationId = LocationId + 10000
-- and so on, for each table

Les requêtes sont relativement simples, mais c'est le plus de travail car vous devez créer manuellement une requête comme celle-ci pour chaque table de la base de données, avec les noms corrects de toutes les colonnes d'ID.

Après avoir exécuté la requête sur la deuxième base de données, les exemples de données de votre question ressembleront à ceci :

Base de données 1 : (exactement comme avant)

Locations :

Id    Name         Adress   etc....
1     Location 1
2     Location 2

Persons :

Id    LocationId     Name     etc...
1     1              Alex
2     1              Peter
3     2              Lisa

Base de données 2 :

Locations :

Id    Name         Adress   etc....
10001 Location A
10002 Location B

Persons :

Id    LocationId     Name     etc...
10001 10001          Mark
10002 10002          Ashley
10003 10001          Ben

Et c'est tout! Vous pouvez désormais importer les données d'une base de données dans l'autre, sans aucune violation de clé primaire.



No