Pertanyaan Masukkan ke dalam ... nilai (SELECT… FROM…)


Saya mencoba INSERT INTO tabel menggunakan input dari tabel lain. Meskipun ini sepenuhnya layak untuk banyak mesin database, saya selalu tampak berjuang untuk mengingat sintaks yang benar untuk SQL mesin hari ini (MySQL, Peramal, SQL Server, Informix, dan DB2).

Apakah ada sintaks peluru perak yang berasal dari standar SQL (misalnya, SQL-92) yang akan memungkinkan saya untuk memasukkan nilai tanpa mengkhawatirkan basis data yang mendasarinya?


1093
2017-08-25 12:45


asal


Jawaban:


Mencoba:

INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2  

Ini adalah standar ANSI SQL dan harus bekerja pada DBMS apa pun

Ini pasti berfungsi untuk:

  • Peramal
  • MS SQL Server
  • MySQL
  • Postgres
  • SQLite v3
  • Teradata
  • DB2
  • Sybase
  • Vertica
  • HSQLDB
  • H2
  • AWS RedShift
  • SAP HANA

1277
2017-08-25 12:47



@Shadow_x99: Itu harus berfungsi dengan baik, dan Anda juga dapat memiliki beberapa kolom dan data lainnya juga:

INSERT INTO table1 ( column1, column2, someInt, someVarChar )
SELECT  table2.column1, table2.column2, 8, 'some string etc.'
FROM    table2
WHERE   table2.ID = 7;

Edit: Saya harus menyebutkan bahwa saya hanya menggunakan sintaks ini dengan Access, SQL 2000/2005 / Express, MySQL, dan PostgreSQL, sehingga mereka harus tertutup. Seorang komentator telah menunjukkan bahwa itu akan bekerja dengan SQLite3.


775
2017-08-25 14:11



Untuk mendapatkan hanya satu nilai dalam nilai multi INSERT dari tabel lain saya melakukan hal berikut di SQLite3:

INSERT INTO column_1 ( val_1, val_from_other_table ) 
VALUES('val_1', (SELECT  val_2 FROM table_2 WHERE val_2 = something))

76
2018-01-10 23:46



Kedua jawaban yang saya lihat berfungsi dengan baik di Informix secara khusus, dan pada dasarnya standar SQL. Artinya, notasinya:

INSERT INTO target_table[(<column-list>)] SELECT ... FROM ...;

berfungsi dengan baik dengan Informix dan, saya harapkan, semua DBMS. (Sekali pada 5 atau lebih tahun yang lalu, ini adalah jenis hal yang tidak selalu didukung oleh MySQL; sekarang memiliki dukungan yang layak untuk sintaks SQL standar ini dan, AFAIK, itu akan berfungsi OK pada notasi ini.) Daftar kolom bersifat opsional tetapi menunjukkan kolom target secara berurutan, sehingga kolom pertama hasil SELECT akan masuk ke kolom pertama yang terdaftar, dll. Dengan tidak adanya daftar kolom, kolom pertama hasil SELECT masuk ke dalam kolom pertama dari tabel target.

Apa yang bisa berbeda antara sistem adalah notasi yang digunakan untuk mengidentifikasi tabel dalam database yang berbeda - standar tidak ada yang mengatakan tentang operasi antar-database (apalagi antar-DBMS). Dengan Informix, Anda dapat menggunakan notasi berikut untuk mengidentifikasi tabel:

[dbase[@server]:][owner.]table

Yaitu, Anda dapat menentukan basis data, secara opsional mengidentifikasi server yang menghosting database tersebut jika tidak berada di server saat ini, diikuti oleh pemilik opsional, titik, dan akhirnya nama tabel yang sebenarnya. Standar SQL menggunakan skema jangka untuk apa Informalk menyebut pemilik. Jadi, di Informix, salah satu dari notasi berikut dapat mengidentifikasi tabel:

table
"owner".table
dbase:table
dbase:owner.table
dbase@server:table
dbase@server:owner.table

Pemilik secara umum tidak perlu dikutip; namun, jika Anda menggunakan tanda kutip, Anda harus membuat nama pemilik dieja dengan benar - itu menjadi peka huruf besar kecil. Itu adalah:

someone.table
"someone".table
SOMEONE.table

semua mengidentifikasi tabel yang sama. Dengan Informix, ada komplikasi ringan dengan MODE ANSI database, di mana nama pemilik umumnya diubah menjadi huruf besar (informix adalah pengecualian). Yaitu, dalam database ANSI MODE (tidak umum digunakan), Anda dapat menulis:

CREATE TABLE someone.table ( ... )

dan nama pemilik dalam katalog sistem adalah "SESEORANG", bukan "seseorang". Jika Anda menyertakan nama pemilik dalam tanda kutip ganda, ia bertindak seperti pengenal terbatas. Dengan SQL standar, pengidentifikasi dibatasi dapat digunakan banyak tempat. Dengan Informix, Anda dapat menggunakannya hanya di sekitar nama pemilik - dalam konteks lain, Informix memperlakukan string yang dikutip dan dikutip dua kali sebagai string, daripada memisahkan string yang dikutip tunggal sebagai string dan string ganda yang dikutip sebagai pengidentifikasi terbatas. (Tentu saja, hanya untuk kelengkapan, ada variabel lingkungan, DELIMIDENT, yang dapat disetel - ke nilai apa pun, tetapi Y paling aman - untuk menunjukkan bahwa tanda kutip ganda selalu mengelilingi pengidentifikasi terbatas dan tanda kutip tunggal selalu mengelilingi string.)

Perhatikan bahwa MS SQL Server mengelola menggunakan [pengidentifikasi terbatas] yang diapit oleh tanda kurung siku. Ini terlihat aneh bagi saya, dan tentu saja bukan bagian dari standar SQL.


52
2017-09-28 03:18



Sebagian besar database mengikuti sintaks dasar,

INSERT INTO TABLE_NAME
SELECT COL1, COL2 ...
FROM TABLE_YOU_NEED_TO_TAKE_FROM
;

Setiap database yang saya gunakan mengikuti sintaks ini yaitu, DB2, SQL Server, MY SQL, PostgresQL


26
2018-04-01 10:09



Untuk menambahkan sesuatu di jawaban pertama, ketika kita ingin hanya beberapa catatan dari tabel lain (dalam contoh ini hanya satu):

INSERT INTO TABLE1
(COLUMN1, COLUMN2, COLUMN3, COLUMN4) 
VALUES (value1, value2, 
(SELECT COLUMN_TABLE2 
FROM TABLE2
WHERE COLUMN_TABLE2 like "blabla"),
value4);

26
2018-04-09 17:15



Ini dapat dilakukan tanpa menentukan kolom di INSERT INTO bagian jika Anda menyediakan nilai untuk semua kolom dalam SELECT bagian.

Katakanlah table1 memiliki dua kolom. Kueri ini seharusnya berfungsi:

INSERT INTO table1
SELECT  col1, col2
FROM    table2

Ini TIDAK AKAN bekerja (nilai untuk col2 tidak ditentukan):

INSERT INTO table1
SELECT  col1
FROM    table2

Saya menggunakan MS SQL Server. Saya tidak tahu cara kerja RDMS lainnya.


22
2017-10-16 14:19



Ini adalah contoh lain menggunakan nilai dengan memilih:

INSERT INTO table1(desc, id, email) 
SELECT "Hello World", 3, email FROM table2 WHERE ...

16
2018-03-20 09:12



Penyisipan sederhana ketika urutan kolom tabel diketahui:

    Insert into Table1
    values(1,2,...)

Kolom penyisipan sederhana:

    Insert into Table1(col2,col4)
    values(1,2)

Penyisipan massal ketika jumlah kolom yang dipilih dari tabel (# tabel2) sama dengan tabel penyisipan (Tabel1)

    Insert into Table1 {Column sequence}
    Select * -- column sequence should be same.
       from #table2

Penyisipan massal saat Anda ingin memasukkan hanya ke dalam kolom tabel yang diinginkan (tabel1):

    Insert into Table1 (Column1,Column2 ....Desired Column from Table1)  
    Select Column1,Column2..desired column from #table2
       from #table2

15
2018-02-13 12:23



Sederhana, bukan VALUES bagian dari INSERT permintaan, gunakan saja SELECT permintaan seperti di bawah ini.

INSERT INTO table1 ( column1 , 2, 3... ) SELECT col1, 2, 3... FROM table2

10
2018-04-21 10:31



INSERT INTO yourtable
SELECT fielda, fieldb, fieldc
FROM donortable;

Ini berfungsi pada semua DBMS


10
2018-05-20 08:44