2009-07-06 10 views
0

J'ai deux tables, la structure de la première récapitule en partie, Itère la structure du second:Insérez dans une table une partie d'une autre table

table1 (id, i, j, k, a, b, c, x, y, z) -- requests 
table2 (id, a, b, c, d) -- essential elements/bank subjects 

je dois insérer dans table1 un enregistrement de table2 avec ID donné. Quelle est la meilleure approche pour le faire?

J'ai deux idées:

1:

DECLARE @a type, @b type, @c type 
SELECT @a = a, @b = b, @c = c, FROM table2 WHERE id = @id 
INSERT INTO table1 (i, j, k, a, b, c, x, y, z) 
VALUES (@i, @j, @k, @a, @b, @c, @x, @y, @z) 

2:

CREATE TABLE #result (a type, b type, c type) 
SELECT a, b, c INTO #result FROM table2 WHERE id = @id 
INSERT INTO table1 (i, j, k, a, b, c, x, y, z) 
    VALUES (@i, @j, @k, 
    (SELECT a FROM #result), 
    (SELECT b FROM #result), 
    (SELECT c FROM #result), 
    @x, @y, @z) 

Quelle autre approche n'EXISTE? Laquelle est la meilleure pratique?

+0

Ceux qui semblent être de bons moyens de le faire, ce qui ne va pas? – rball

+0

Je veux juste trouver le meilleur. Et comprendre les raisons de ce choix. Apprenez-en plus sur ce sujet. – abatishchev

Répondre

6

je le ferais comme ceci:

INSERT INTO table1 (i, j, k, a, b, c, d, x, y ,z) 
Select @i, @j @k, a, b, c, d, @x, @y, @z 
From table2 
Where id = @id 

Cela vous évite d'obtenir les données aux variables locales et/ou des tables temporaires. La performance devrait être meilleure.

La partie importante à réaliser est que vous pouvez coder les valeurs dans le select. L'ordre dans lequel vous lissez les colonnes (ligne d'insertion) doit correspondre à l'ordre dans lequel vous avez répertorié les colonnes dans la ligne de sélection.

2

Vous pouvez le faire avec une seule requête d'insertion:

insert into table1 (a, b, c, d, x, y, z) 
select a, b, c, d, @x, @y, @z 
from table2 
where id = @id 

Edit:
Avec les champs supplémentaires que vous avez ajoutés ce serait:

insert into table1 (i, j, k, a, b, c, x, y, z) 
select @i, @j, @k, a, b, c, @x, @y, @z 
from table2 
where id = @id 
+0

J'ai modifié un peu mon article. Regarde s'il te plait. Votre solution fonctionnera-t-elle si table1 contient des colonnes de table2 au milieu? – abatishchev

+1

Oui, bien sûr. Vous pouvez utiliser tout ce que vous pouvez mettre dans une sélection régulière. – Guffa

1

La table temporaire pourrait être un avantage à travers le processus de développement si vous éprouvez des difficultés à identifier les données qui sont insérées. Cela peut également être utile si vous devez effectuer d'autres modifications de données qui "obligent" un curseur à faire défiler les enregistrements. Sinon, ce n'est qu'une autre partie de votre code que vous devrez mettre à jour lorsque vous ajoutez un champ.

Questions connexes