Comment faire pour insérer dans une table des enregistrements extraits d'une autre table
Question
J'essaie d'écrire une requête qui extrait et transforme les données d'une table, puis les insère dans une autre table. Oui, il s'agit d'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 je reçois un message d'erreur de syntaxe.
Que feriez-vous si vous voulez faire cela?
La solution
Pas de "VALEURS", pas de parenthèses:
INSERT INTO Table2(LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1;
Autres conseils
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
N'oubliez pas que l'option 2 créera un tableau avec uniquement les colonnes de la projection (celles du SELECT).
Supprimez les valeurs et la parenthèse.
INSERT INTO Table2 (LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) FROM Table1 GROUP BY LongIntColumn1
Supprimez VALUES
de votre code SQL.
Je pense que votre problème dans cet exemple concerne les "valeurs". mot-clé. Vous utilisez les " valeurs " mot-clé 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 d'enregistrements multiples:
INSERT INTO target [(field1[, field2[, …]])] [IN externaldatabase]
SELECT [source.]field1[, field2[, …]
FROM tableexpression
Requête d'ajout d'enregistrement unique:
INSERT INTO target [(field1[, field2[, …]])]
VALUES (value1[, value2[, …])
Supprimer les " valeurs " lorsque vous ajoutez un groupe de lignes, 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 aucun alias.
Si les noms des colonnes sont identiques 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;
Eh bien, je pense que le meilleur moyen serait (sera?) de définir 2 jeux d’enregistrements et de les utiliser comme intermédiaires entre les 2 tables.
- Ouvrir les deux jeux d'enregistrements
- Extraire les données de la première table (SELECT blablabla)
- Mettez à jour le deuxième jeu d'enregistrements avec les données disponibles dans le premier (en ajoutant de nouveaux enregistrements ou en mettant à jour des enregistrements existants
- Fermer les deux jeux d'enregistrements
Cette méthode est particulièrement intéressante si vous envisagez de mettre à jour des tables à partir de bases de données différentes (chaque jeu d’enregistrements peut avoir sa propre connexion ...)
insertion de données d'une table à une autre dans différentes bases de données
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
Voulez-vous insérer l'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);
Cela créera une nouvelle table - > T1 avec les informations extraites