176 votes

Comment effectuer une INSERTION dans une table avec des enregistrements extraits d'une autre table

Je tente d'écrire une requête qui extrait et transforme des données d'une table puis insère ces données dans une autre table. Oui, c'est une requête de data warehousing et je le fais dans MS Access. Donc en gros, 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 ?

278voto

pilsetnieks Points 4944

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

INSÉRER DANS Table2 (ColonneLongueInt2, ColonneDeDevise2)
SÉLECTIONNER ColonneLongueInt1, Avg(ColonneDeDevise) as ColonneDeDevise1 DE Table1 GROUPE PAR ColonneLongueInt1;

28voto

smink Points 39640

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 seulement les colonnes de la projection (celles sur le SELECT).

24voto

GSerg Points 33571

Supprimez à la fois les VALEURS et les parenthèses.

INSÉRER DANS Table2 (LongIntColumn2, CurrencyColumn2)
SÉLECTIONNER LongIntColumn1, Avg(CurrencyColumn) DE Table1 GROUPE PAR LongIntColumn1

10voto

Supprimez VALUES de votre SQL.

10voto

Sean Points 310

Je crois que votre problème dans ce cas est le mot-clé "values". 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.

Aussi, vous n'avez vraiment pas besoin des parenthèses autour de la déclaration select.

De msdn:

Requête d'ajout de plusieurs enregistrements:

INSERT INTO cible [(champ1[, champ2[, …]])] [dans basededonneesexterne]
SELECT [source.]champ1[, champ2[, …]
FROM expressiontable

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

INSERT INTO cible [(champ1[, champ2[, …]])]     
VALUES (valeur1[, valeur2[, …])

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