it-swarm-pt.tech

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

O que você faria se quisesse fazer isso?

172
Martin08

Sem "VALORES", sem parênteses:

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

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

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

25
Jorge Ferreira

Remova os dois VALORES e os parênteses.

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

Remova VALUES do seu SQL.

10
Forgotten Semicolon

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 anexação 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[, …])
9
Sean

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 no 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;
4
Chris OC

Bem, eu acho que a melhor maneira seria (será?) Definir dois conjuntos de registros e usá-los como intermediários 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 ...)

2
Philippe Grondier

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

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

1
Ashwin