Comment faire INSERT dans une table des enregistrements extraits d'une autre table

177

J'essaie d'écrire une requête qui extrait et transforme les données d'une table, puis insère ces données dans une autre table. Oui, c'est une requête d'entreposage de données et je le fais dans MS Access. Donc, fondamentalement, je veux une requête comme celle-ci:

INSERT INTO Table2(LongIntColumn2, CurrencyColumn2) VALUES
  (SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1);

J'ai essayé mais j'obtiens un message d'erreur de syntaxe.

Que feriez-vous si vous vouliez faire cela?

Martin08
la source

Réponses:

283

Pas de "VALEURS", pas de parenthèses:

INSERT INTO Table2(LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1;
pilsetnieks
la source
11
en fait si non. des colonnes et leurs types sont les mêmes et ces sorties dans le même ordre dans les tables alors vous pouvez simplement dire, INSERT INTO Table2 SELECT * FROM table1;
sactiw
28

Vous avez deux options de syntaxe:

Option 1

CREATE TABLE Table1 (
    id int identity(1, 1) not null,
    LongIntColumn1 int,
    CurrencyColumn money
)

CREATE TABLE Table2 (
    id int identity(1, 1) not null,
    LongIntColumn2 int,
    CurrencyColumn2 money
)

INSERT INTO Table1 VALUES(12, 12.00)
INSERT INTO Table1 VALUES(11, 13.00)

INSERT INTO Table2
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1

Option 2

CREATE TABLE Table1 (
    id int identity(1, 1) not null,
    LongIntColumn1 int,
    CurrencyColumn money
)

INSERT INTO Table1 VALUES(12, 12.00)
INSERT INTO Table1 VALUES(11, 13.00)


SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1
INTO Table2
FROM Table1
GROUP BY LongIntColumn1

Gardez à l'esprit que l'option 2 créera une table avec uniquement les colonnes de la projection (celles du SELECT).

Jorge Ferreira
la source
24

Supprimez les valeurs et les parenthèses.

INSERT INTO Table2 (LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) FROM Table1 GROUP BY LongIntColumn1
GSerg
la source
10

Supprimer VALUESde votre SQL.

Point-virgule oublié
la source
10

Je crois que votre problème dans ce cas est le mot-clé "valeurs". Vous utilisez le mot clé "values" lorsque vous insérez une seule ligne de données. Pour insérer les résultats d'une sélection, vous n'en avez pas besoin.

De plus, vous n'avez vraiment pas besoin des parenthèses autour de l'instruction select.

De msdn :

Requête d'ajout à plusieurs enregistrements:

INSERT INTO target [(field1[, field2[, …]])] [IN externaldatabase]
SELECT [source.]field1[, field2[, …]
FROM tableexpression

Requête d'ajout d'un seul enregistrement:

INSERT INTO target [(field1[, field2[, …]])]     
VALUES (value1[, value2[, …])
Sean
la source
4

Supprimez les "valeurs" lorsque vous ajoutez un groupe de lignes et supprimez les parenthèses supplémentaires. Vous pouvez éviter la référence circulaire en utilisant un alias pour avg (CurrencyColumn) (comme vous l'avez fait dans votre exemple) ou en n'utilisant pas du tout d'alias.

Si les noms de colonne sont les mêmes dans les deux tables, votre requête ressemblerait à ceci:

INSERT INTO Table2 (LongIntColumn, Junk)
SELECT LongIntColumn, avg(CurrencyColumn) as CurrencyColumn1
FROM Table1
GROUP BY LongIntColumn;

Et cela fonctionnerait sans alias:

INSERT INTO Table2 (LongIntColumn, Junk)
SELECT LongIntColumn, avg(CurrencyColumn)
FROM Table1
GROUP BY LongIntColumn;
Chris OC
la source
2

Eh bien, je pense que le meilleur moyen serait (sera?) De définir 2 jeux d'enregistrements et de les utiliser comme intermédiaire entre les 2 tables.

  1. Ouvrez les deux jeux d'enregistrements
  2. Extraire les données du premier tableau (SELECT blablabla)
  3. Mettre à jour le deuxième jeu d'enregistrements avec les données disponibles dans le premier jeu d'enregistrements (soit en ajoutant de nouveaux enregistrements, soit en mettant à jour des enregistrements existants
  4. Fermer les deux jeux d'enregistrements

Cette méthode est particulièrement intéressante si vous prévoyez de mettre à jour des tables à partir de différentes bases de données (c'est-à-dire que chaque jeu d'enregistrements peut avoir sa propre connexion ...)

Philippe Grondier
la source
2

insertion de données d'une table dans une autre table dans une BASE DE DONNÉES différente

insert into DocTypeGroup 
    Select DocGrp_Id,DocGrp_SubId,DocGrp_GroupName,DocGrp_PM,DocGrp_DocType 
    from Opendatasource( 'SQLOLEDB','Data Source=10.132.20.19;UserID=sa;Password=gchaturthi').dbIPFMCI.dbo.DocTypeGroup
PRITESH PARMAR PINTOO
la source
1

Voulez-vous insérer une extraction dans une table existante?

Si cela n'a pas d'importance, vous pouvez essayer la requête ci-dessous:

SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 INTO T1 FROM Table1 
GROUP BY LongIntColumn1);

Il créera une nouvelle table -> T1 avec les informations extraites

JuilletOrdinaire
la source