Pregunta

Estoy intentando escribir una consulta que extraiga y transforme datos de una tabla y luego los inserte en otra tabla.Sí, esta es una consulta de almacenamiento de datos y la estoy haciendo en MS Access.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 aparece un mensaje de error de sintaxis.

¿Qué harías si quisieras hacer esto?

¿Fue útil?

Solución

Sin "VALOR", sin paréntesis:

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

Otros consejos

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 de la proyección (las del SELECT).

Elimine tanto VALORES como el paréntesis.

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

Eliminar VALUES desde su SQL.

Creo que su problema en este caso es la palabra clave "valores".Utilice la palabra clave "valores" cuando inserte solo una fila de datos.Para insertar los resultados de una selección, no lo necesita.

Además, realmente no necesita los paréntesis alrededor de la declaración de selección.

De msdn:

Consulta de adición de registros múltiples:

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

Consulta de adición de un solo registro:

INSERT INTO target [(field1[, field2[, …]])]     
VALUES (value1[, value2[, …])

Elimine los "valores" cuando agregue un grupo de filas y elimine los paréntesis adicionales.Puede evitar la referencia circular usando un alias para avg(CurrencyColumn) (como lo hizo en su ejemplo) o no usando ningún alias.

Si los nombres de las columnas 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;

Bueno, creo que la mejor manera sería (¿será?) definir 2 conjuntos de registros y usarlos como intermedio entre las 2 tablas.

  1. Abrir ambos conjuntos de registros
  2. Extrae los datos de la primera tabla (SELECT blablabla)
  3. Actualizar el segundo conjunto de registros con los datos disponibles en el primer conjunto de registros (ya sea agregando nuevos registros o actualizando los registros existentes).
  4. Cerrar ambos conjuntos de registros

Este método es particularmente interesante si planea actualizar tablas de diferentes bases de datos (es decir, cada conjunto de registros puede tener su propia conexión...)

insertar datos de una tabla a otra tabla en diferentes BASE DE DATOS

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

¿Quiere 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top