2008-09-16 12 views
148

Estoy tratando de escribir una consulta que extraiga y transforme datos de una tabla y luego inserte 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 hacer una consulta como esta:Cómo hacer INSERTAR en una tabla los registros extraídos de otra tabla

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

He intentado pero obtengo un mensaje de error de sintaxis.

¿Qué harías si quieres hacer esto?

Respuesta

238

No hay "valores", sin paréntesis:

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

en realidad si no. de columnas y sus tipos son los mismos y esas salidas en el mismo orden en las tablas, entonces usted puede simplemente decir, INSERTAR EN Table2 SELECT * FROM table1; – sactiw

9

Elimina VALUES de tu SQL.

18

eliminar tanto los valores y el paréntesis.

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

Usted tiene 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 

Opción 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 (los de SELECT).

2

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

  1. Abrir ambos conjuntos de registros
  2. extraer los datos de la primera tabla (SELECT blablabla)
  3. actualización segundo conjunto de registros con los datos disponibles en el primer conjunto de registros (ya sea mediante la adición de nuevos registros o actualizar 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 ...)

7

Creo que su problema en este caso es la palabra clave "valores". Utiliza la palabra clave "valores" cuando está insertando 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 instrucción de selección.

De msdn:

Múltiple-registro de datos anexados:

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

un solo registro de datos anexados:

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

¿Quieres insertar la extracción de una tabla existente?

Si no importa entonces usted puede probar la consulta a continuación:

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

Se va a crear una nueva tabla -> T1 con la información extraída "valores"

2

Retire cuando se está añadiendo un grupo de filas y elimina los paréntesis adicionales. Puede evitar la referencia circular utilizando un alias para avg (CurrencyColumn) (como lo hizo en su ejemplo) o no usando un alias.

Si los nombres de columna son los mismos en ambas tablas, la consulta sería la siguiente:

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; 
1

insertar formulario de datos de una tabla a otra tabla en diferentes BASES 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 
Cuestiones relacionadas