Cara melakukan INSERT ke dalam tabel catatan yang diekstrak dari tabel lain

177

Saya mencoba menulis kueri yang mengekstrak dan mengubah data dari tabel dan kemudian memasukkan data tersebut ke tabel lain. Ya, ini adalah kueri pergudangan data dan saya melakukannya di MS Access. Jadi pada dasarnya saya ingin beberapa permintaan seperti ini:

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

Saya mencoba tetapi mendapatkan pesan kesalahan sintaksis.

Apa yang akan Anda lakukan jika Anda ingin melakukan ini?

Martin08
sumber

Jawaban:

283

Tidak ada "NILAI", tidak ada tanda kurung:

INSERT INTO Table2(LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1;
pilsetnieks
sumber
11
sebenarnya kalau tidak. kolom dan tipenya sama dan mereka keluar dalam urutan yang sama dalam tabel maka Anda dapat dengan mudah mengatakan, INSERT INTO Table2 SELECT * FROM table1;
sactiw
28

Anda memiliki dua opsi sintaks:

Pilihan 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

pilihan 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

Ingatlah bahwa Opsi 2 akan membuat tabel dengan hanya kolom pada proyeksi (yang ada di SELECT).

Jorge Ferreira
sumber
24

Hapus VALUES dan kurung.

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

Hapus VALUESdari SQL Anda.

Titik Koma Lupa
sumber
10

Saya yakin masalah Anda dalam hal ini adalah kata kunci "nilai". Anda menggunakan kata kunci "nilai" ketika Anda hanya memasukkan satu baris data. Untuk memasukkan hasil pilih, Anda tidak membutuhkannya.

Juga, Anda benar-benar tidak membutuhkan tanda kurung di sekitar pernyataan pilih.

Dari msdn :

Rekam beberapa permintaan tambahan:

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

Permintaan penambahan catatan tunggal:

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

Hapus "nilai" saat Anda menambahkan grup baris, dan hapus tanda kurung tambahan. Anda dapat menghindari referensi melingkar dengan menggunakan alias untuk rata-rata (CurrencyColumn) (seperti yang Anda lakukan dalam contoh Anda) atau dengan tidak menggunakan alias sama sekali.

Jika nama kolom sama di kedua tabel, kueri Anda akan seperti ini:

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

Dan itu akan bekerja tanpa alias:

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

Yah saya pikir cara terbaik adalah (akan?) Untuk mendefinisikan 2 recordset dan menggunakannya sebagai perantara antara 2 tabel.

  1. Buka kedua recordset
  2. Ekstrak data dari tabel pertama (SELECT blablabla)
  3. Perbarui recordset ke-2 dengan data yang tersedia di recordset pertama (baik dengan menambahkan catatan baru atau memperbarui catatan yang ada
  4. Tutup kedua recordset

Metode ini sangat menarik jika Anda berencana untuk memperbarui tabel dari database yang berbeda (yaitu setiap recordset dapat memiliki koneksi sendiri ...)

Philippe Grondier
sumber
2

memasukkan data dari satu tabel ke tabel lain di DATABASE yang berbeda

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
sumber
1

Apakah Anda ingin memasukkan ekstraksi di tabel yang ada?

Jika tidak masalah maka Anda dapat mencoba pertanyaan di bawah ini:

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

Ini akan membuat tabel baru -> T1 dengan informasi yang diekstrak

JulyOrdinary
sumber