Estoy intentando escribir una consulta que extrae y transforma datos de una tabla y luego inserto esos datos en otra tabla. Sí, esta es una consulta de almacenamiento de datos y lo estoy haciendo en MS Access. Así que básicamente quiero una consulta como esta:
INSERT INTO Table2(LongIntColumn2, CurrencyColumn2) VALUES
(SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1);
Lo intenté pero recibí un mensaje de error de sintaxis.
¿Qué harías si quisieras hacer esto?
Sin "valores", sin paréntesis:
INSERT INTO Table2(LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1;
Tienes dos opciones de sintaxis:
Opción 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
Opcion 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
Tenga en cuenta que la Opción 2 creará una tabla con solo las columnas en la proyección (las de SELECT).
Eliminar ambos valores y el paréntesis.
INSERT INTO Table2 (LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) FROM Table1 GROUP BY LongIntColumn1
Elimine VALUES
de su SQL.
Creo que su problema en este caso es la palabra clave "valores". Utiliza la palabra clave "valores" cuando inserta solo una fila de datos. Para insertar los resultados de una selección, no la necesita.
Además, realmente no necesita los paréntesis alrededor de la declaración de selección.
Desde msdn :
Consulta agregada de múltiples registros:
INSERT INTO target [(field1[, field2[, …]])] [IN externaldatabase]
SELECT [source.]field1[, field2[, …]
FROM tableexpression
Consulta adjunta de un solo registro:
INSERT INTO target [(field1[, field2[, …]])]
VALUES (value1[, value2[, …])
Elimine "valores" cuando agregue un grupo de filas y elimine los paréntesis adicionales. Puede evitar la referencia circular utilizando un alias para avg (CurrencyColumn) (como lo hizo en su ejemplo) o no utilizando un alias en absoluto.
Si los nombres de columna son los mismos en ambas tablas, su consulta sería así:
INSERT INTO Table2 (LongIntColumn, Junk)
SELECT LongIntColumn, avg(CurrencyColumn) as CurrencyColumn1
FROM Table1
GROUP BY LongIntColumn;
Y funcionaría sin un alias:
INSERT INTO Table2 (LongIntColumn, Junk)
SELECT LongIntColumn, avg(CurrencyColumn)
FROM Table1
GROUP BY LongIntColumn;
insertar datos de una tabla a otra en una BASE DE DATOS diferente
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
Bueno, creo que la mejor manera sería (será?) Definir 2 conjuntos de registros y utilizarlos como intermedios entre las 2 tablas.
Este método es particularmente interesante si planea actualizar tablas desde diferentes bases de datos (es decir, cada conjunto de registros puede tener su propia conexión ...)
¿Desea insertar extracción en una tabla existente?
Si no importa, puede probar la siguiente consulta:
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 INTO T1 FROM Table1
GROUP BY LongIntColumn1);
Creará una nueva tabla -> T1 con la información extraída