Como fazer INSERT em uma tabela de registros extraídos de outra tabela

Eu estou tentando escrever uma consulta que extrai e transforma dados de uma tabela e insira esses dados em outra tabela. Sim, esta é uma consulta de data warehousing e estou fazendo isso no MS Access. Então, basicamente, eu quero alguma consulta como esta:

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

Eu tentei, mas recebi uma mensagem de erro de syntax.

O que você faria se quisesse fazer isso?

Sem “VALORES”, sem parênteses:

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

Você tem duas opções de syntax:

Opção 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 

opção 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 

Tenha em mente que a Opção 2 criará uma tabela com apenas as colunas na projeção (aquelas no SELECT).

Remova os dois VALORES e os parênteses.

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

Remova VALUES do seu SQL.

Eu acredito que o seu problema nesta instância é a palavra-chave “valores”. Você usa a palavra-chave “values” quando está inserindo apenas uma linha de dados. Para inserir os resultados de um select, você não precisa dele.

Além disso, você realmente não precisa dos parênteses ao redor da instrução select.

De msdn :

Consulta de acréscimo de vários registros:

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

Consulta de anexação de registro único:

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

Bem, eu acho que a melhor maneira seria (será?) Definir dois conjuntos de registros e usá-los como um intermediário entre as duas tabelas.

  1. Abra os dois conjuntos de registros
  2. Extraia os dados da primeira tabela (SELECT blablabla)
  3. Atualizar o segundo conjunto de registros com dados disponíveis no primeiro conjunto de registros (adicionando novos registros ou atualizando os registros existentes
  4. Feche os dois conjuntos de registros

Esse método é particularmente interessante se você planeja atualizar tabelas de bancos de dados diferentes (ou seja, cada conjunto de registros pode ter sua própria conexão …)

inserir dados formam uma tabela para outra tabela em diferentes DATABASE

 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 

Remova os “valores” ao adicionar um grupo de linhas e remova os parênteses extras. Você pode evitar a referência circular usando um alias para avg (CurrencyColumn) (como fez em seu exemplo) ou não usando um alias.

Se os nomes das colunas forem os mesmos em ambas as tabelas, sua consulta seria assim:

 INSERT INTO Table2 (LongIntColumn, Junk) SELECT LongIntColumn, avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn; 

E funcionaria sem um alias:

 INSERT INTO Table2 (LongIntColumn, Junk) SELECT LongIntColumn, avg(CurrencyColumn) FROM Table1 GROUP BY LongIntColumn; 

Você deseja inserir extração em uma tabela existente?

Se não importa, então você pode tentar a consulta abaixo:

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

Criará uma nova tabela -> T1 com a informação extraída