Come eseguire INSERT in un record di tabella estratto da un'altra tabella


177

Sto cercando di scrivere una query che estrae e trasforma i dati da una tabella e quindi li inserisco in un'altra tabella. Sì, questa è una query di data warehousing e lo sto facendo in MS Access. Quindi in pratica voglio delle query come questa:

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

Ho provato ma ho ricevuto un messaggio di errore di sintassi.

Cosa faresti se vuoi farlo?

Risposte:


283

Nessun "VALORE", nessuna parentesi:

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

11
in realtà se no. delle colonne e i loro tipi sono uguali e quelle escono nello stesso ordine nelle tabelle, quindi si può semplicemente dire, INSERIRE IN Tabella2 SELEZIONA * DA tabella1;
Sactiw,

28

Sono disponibili 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

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


24

Rimuovere entrambi i VALORI e la parentesi.

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


10

Credo che il tuo problema in questo caso sia la parola chiave "valori". Utilizzare la parola chiave "valori" quando si inserisce solo una riga di dati. Per inserire i risultati di una selezione, non è necessario.

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

Da msdn :

Query di accodamento a più record:

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

4

Rimuovi "valori" quando aggiungi un gruppo di righe e rimuovi le parentesi extra. 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 query sarebbe così:

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

E funzionerebbe senza un alias:

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

2

Beh, 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 (SELECT blablabla)
  3. Aggiorna il 2 ° recordset con i dati disponibili nel primo recordset (aggiungendo nuovi record o aggiornando quelli esistenti
  4. Chiudi entrambi i recordset

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


2

l'inserimento di dati da una tabella a un'altra tabella in diversi 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

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.