56 votes

Insérer une ligne dans un tableau pour chaque id dans un autre tableau

J'ai essayé de chercher ici une solution similaire mais je n'en ai pas trouvé. Je me demandais donc quelle était la meilleure façon d'accomplir ce qui suit.

Je dispose d'une table contenant plus de 17 millions de lignes, qui ont toutes un identifiant unique. Nous avons récemment créé une nouvelle table qui sera utilisée en conjonction avec la table précédente où la clé étrangère de la nouvelle table est l'identifiant unique de l'ancienne table.

Par exemple.
Table 1 - id, field1, field2, field3... table 2 - table1.id, field1 ...

Le problème est que, puisque nous migrons ce système vers un environnement réel, nous devons remplir la table 2 avec une ligne contenant l'identifiant de la table 1 pour chaque ligne de la table 1. ex, table 1 - 1, test, null La table 2 doit maintenant contenir : 1, null, ... et ainsi de suite pour chaque ligne de la table 1. Le problème principal est que les identifiants ne sont pas tous séquentiels dans la table 1. Nous devrons donc lire la table 1, puis insérer l'identifiant trouvé dans la table 2.

Y a-t-il un moyen plus simple de procéder ? Merci d'avance Joe

En outre, pour clarifier, la table 2 sera une nouvelle donnée et la seule chose qu'elle contiendra de la table 1 est l'identifiant pour conserver la relation de clé étrangère.

Il s'agit également de sql server 2000

56voto

kristof Points 18322

Si je comprends bien, vous voulez un enregistrement dans la table 2 pour chaque enregistrement dans la table 1. Je pense également qu'à part la référence à la table 1, la table 2 doit initialement contenir des lignes vides.

Donc en supposant

table1 (ID, field1, field2, ...)
table2 (ID, table1_ID, fieldA, fieldB,...)
-- where table1_ID is a reference to ID of table1

Après avoir créé la table 2, vous pouvez simplement exécuter cette instruction d'insertion.

insert into table2(table1_ID) 
select ID from table1

21voto

Ryan Guill Points 6115

Je ne suis pas sûr de vous suivre exactement, mais est-ce que quelque chose comme ça fonctionnerait pour vous ?

INSERT INTO table2 ( SELECT field1, field2, field3... FROM table1 )

Si je comprends bien, vous voulez un enregistrement dans la table 2 pour chaque enregistrement dans la table 1. C'est ce que nous ferons. Il suffit de faire correspondre les champs de la sélection dans le bon ordre, et de spécifier des constantes pour tous les champs de la table 2 que vous n'avez pas dans la table 1.

HTH. Faites-moi savoir si je n'ai pas compris et j'essaierai de vous aider à nouveau.

4voto

David B Points 53123

Vous devez lire cet article.

http://stackoverflow.com/questions/346659/what-are-the-most-common-sql-anti-patterns#346679

Le problème principal est que les identifiants ne sont pas tous séquentiels dans la table 1. Nous devrons donc lire la table 1, puis insérer l'identifiant trouvé dans la table 2.

Oui, regardez ma réponse dans l'article ci-dessus et écrivez une boucle de marche par clé en utilisant l'élément #2.

Assurez-vous que lorsque vous écrivez la déclaration d'insertion, vous fournissez une liste de champs - comme je le dis au point 1.

0voto

Que se passe-t-il s'il y a beaucoup de valeurs à insérer dans une zone de texte et qu'une valeur provient d'une autre table ? Exemple : table 1(curriculum_id, année_implémentée, cours) table 2(id_étudiant, nom_famille, prénom, cours, id_cursus)

j'ai besoin d'insérer la valeur de la table 1(curriculum_id)

si je faisais ceci insérer dans table2(table1_ID) sélectionner ID de table1

qu'en est-il des autres valeurs de la zone de texte dans la déclaration d'insertion ?

-1voto

Binary Worrier Points 27424

Avec un tel nombre de lignes, vous risquez de rencontrer des problèmes d'espace dans le journal des transactions et de durée d'exécution des transactions d'insertion.

Si le temps d'exécution est une contrainte, je recommande sérieusement d'utiliser Bcp (ou tout autre outil applicable en fonction de la plate-forme).

Sélectionnez les identifiants de la table originale, utilisez-les pour créer un fichier Bcp pour la table d'extension, puis insérez-le dans le fichier Bcp.

Il est souvent plus performant de traiter des fichiers de 10 000 enregistrements plutôt qu'un fichier énorme contenant 17 millions de lignes.

Vous pouvez également effectuer cette opération en arrière-plan, avant la mise en service, et écrire un travail t-sql pour récupérer les éléments qui ont pu être insérés après que vous ayez pris la liste instantanée des identifiants.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X