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?

Respostas:


283

Sem "VALORES", sem parênteses:

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

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).


24

Remova os VALUES e os parênteses.

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


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[, …])

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;

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 ...)


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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.