pengembangan-web-mp-pd.com

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

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?

172
Martin08

Tidak ada "NILAI", tidak ada tanda kurung:

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

Anda memiliki dua opsi sintaks:

Opsi 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

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

25
Jorge Ferreira

Hapus VALUES dan kurung.

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

Hapus VALUES dari SQL Anda.

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

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

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

2

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

1
Ashwin