it-swarm.it

Come fare INSERIRE in una tabella record estratti da un'altra tabella

Sto cercando di scrivere una query che estrae e trasformi i dati da una tabella e li inserisca in un'altra tabella. Sì, questa è una query di data warehousing e lo sto facendo in MS Access. Quindi fondamentalmente voglio qualche domanda come questa:

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

Ho provato ma ottengo un messaggio di errore di sintassi.

Cosa faresti se vuoi farlo?

172
Martin08

Nessun "VALORE", nessuna parentesi:

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

Hai due opzioni di sintassi:

Opzione 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

Opzione 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

Ricorda che l'opzione 2 creerà una tabella con solo le colonne sulla proiezione (quelle su SELEZIONA).

25
Jorge Ferreira

Rimuovi entrambi i VALORI e le parentesi.

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

Rimuovi VALUES dal tuo SQL.

10

Credo che il tuo problema in questa istanza sia la parola chiave "values". Si utilizza la parola chiave "values" quando si inserisce solo una riga di dati. Per inserire i risultati di una selezione, non ne hai bisogno.

Inoltre, non hai davvero bisogno delle parentesi attorno all'istruzione select.

Da msdn :

Query di accodamento a record multipli:

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

Query di accodamento a record singolo:

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

Rimuovi i "valori" quando aggiungi un gruppo di righe e rimuovi le parentesi aggiuntive. Puoi evitare il riferimento circolare usando un alias per avg (CurrencyColumn) (come hai fatto nel tuo esempio) o non usando affatto un alias.

Se i nomi delle colonne sono uguali in entrambe le tabelle, la tua domanda sarebbe la seguente:

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

E funzionerebbe senza uno pseudonimo:

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

Bene, penso che il modo migliore sarebbe (sarà?) Di definire 2 recordset e usarli come intermedio tra le 2 tabelle.

  1. Apri entrambi i recordset
  2. Estrai i dati dalla prima tabella (SELEZIONA blablabla)
  3. Aggiornare il secondo recordset con i dati disponibili nel primo recordset (aggiungendo nuovi record o aggiornando i record esistenti
  4. Chiudere entrambi i recordset

Questo metodo è particolarmente interessante se si prevede di aggiornare tabelle da diversi database (ad esempio, ogni recordset può avere una propria connessione ...)

2

Vuoi inserire l'estrazione in una tabella esistente?

Se non importa, puoi provare la seguente query:

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

Creerà una nuova tabella -> T1 con le informazioni estratte

1
Ashwin