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

177

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

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

Tentei, mas recebi uma mensagem de erro de sintaxe.

O que você faria se quisesse fazer isso?

Martin08
fonte

Respostas:

283

Sem "VALORES", sem parênteses:

INSERT INTO Table2(LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1;
pilsetnieks
fonte
11
na verdade se não. de colunas e seus tipos são iguais e as saídas na mesma ordem nas tabelas, você pode simplesmente dizer: INSERIR NA TABELA2 SELECT * FROM tabela1;
precisa saber é
28

Você tem duas opções de sintaxe:

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

Lembre-se de que a opção 2 criará uma tabela com apenas as colunas na projeção (aquelas no SELECT).

Jorge Ferreira
fonte
24

Remova os VALUES e os parênteses.

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

Remova VALUESdo seu SQL.

Ponto e vírgula esquecido
fonte
10

Acredito que seu problema nesta instância seja a palavra-chave "values". Você usa a palavra-chave "values" quando está inserindo apenas uma linha de dados. Para inserir os resultados de uma seleção, você não precisa disso.

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

Do msdn :

Consulta de acréscimo de vários registros:

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

Consulta de acréscimo de registro único:

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

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

Se os nomes das colunas forem os mesmos nas duas tabelas, sua consulta será assim:

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

E funcionaria sem um pseudônimo:

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

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

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

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

Philippe Grondier
fonte
2

inserção de dados de 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
PRITESH PARMAR PINTOO
fonte
1

Deseja inserir extração em uma tabela existente?

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

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

Ele criará uma nova tabela -> T1 com as informações extraídas

JulyOrdinary
fonte