Saya mencoba untuk MEMASUKKAN KE
meja yang menggunakan input dari tabel lain. Meskipun ini adalah sepenuhnya layak untuk banyak database engine, saya selalu tampaknya perjuangan untuk mengingat sintaks yang benar untuk SQL
engine of the day (MySQL, Oracle, SQL Server, Informix, dan DB2).
Apakah ada silver-peluru sintaks yang datang dari SQL standar (misalnya, SQL-92) yang akan memungkinkan saya untuk menyisipkan nilai-nilai tanpa khawatir tentang database?
Coba:
INSERT INTO table1 ( column1 )
SELECT col1
FROM table2
Ini adalah standar ANSI SQL dan harus bekerja pada setiap DBMS
Itu pasti bekerja untuk:
@Shadow_x99: Yang harus bekerja dengan baik, dan anda juga dapat memiliki beberapa kolom dan data lainnya serta:
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 aku've hanya digunakan sintaks ini dengan Access, SQL 2000 tahun 2005/Express, MySQL, dan PostgreSQL, sehingga mereka harus ditutupi. Commenter telah menunjukkan bahwa itu'll bekerja dengan SQLite3.
Untuk mendapatkan hanya satu nilai dalam multi value INSERT
dari meja lain yang saya lakukan 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))
Kedua jawaban yang saya lihat bekerja dengan baik dalam Informix secara khusus, dan pada dasarnya standar SQL. Artinya, notasi:
INSERT INTO target_table[(<column-list>)] SELECT ... FROM ...;
bekerja dengan baik dengan Informix dan, yang saya harapkan, semua DBMS. (Setelah 5 atau lebih tahun yang lalu, ini adalah semacam hal bahwa MySQL tidak selalu mendukung; sekarang memiliki dukungan yang layak untuk jenis standar sintaks SQL dan, AFAIK, itu akan bekerja OK pada notasi ini.) Daftar kolom adalah opsional, tetapi menunjukkan target kolom dalam urutan, sehingga kolom pertama dari hasil PILIH akan masuk ke pertama yang tercantum kolom, dll. Dengan tidak adanya daftar kolom, kolom pertama dari hasil PILIH masuk ke kolom pertama dari tabel target.
Apa yang bisa berbeda antara sistem notasi yang digunakan untuk mengidentifikasi tabel dalam database yang berbeda - standar memiliki apa-apa untuk mengatakan tentang inter-database (apalagi inter-DBMS) operasi. Dengan Informix, anda dapat menggunakan notasi berikut untuk mengidentifikasi tabel:
[dbase[@server]:][owner.]table
Artinya, anda dapat menentukan database, opsional mengidentifikasi server yang host database yang jika tidak dalam server saat ini, diikuti oleh opsional pemilik, dot, dan akhirnya sebenarnya nama tabel. SQL standar menggunakan istilah skema untuk apa Informix panggilan pemilik. Dengan demikian, dalam Informix, berikut notasi bisa mengidentifikasi sebuah tabel:
table
"owner".table
dbase:table
dbase:owner.table
dbase@server:table
dbase@server:owner.table
Pemilik pada umumnya tidak perlu diberi tanda kutip; namun, jika anda tidak menggunakan tanda kutip, anda perlu untuk mendapatkan nama pemilik dieja dengan benar - itu menjadi hal yang sensitif. Yaitu:
someone.table
"someone".table
SOMEONE.table
semua mengidentifikasi tabel yang sama. Dengan Informix, ada's ringan komplikasi dengan MODUS ANSI database, di mana pemilik nama-nama pada umumnya dikonversi ke huruf besar (informix adalah pengecualian). Artinya, dalam MODE ANSI database (tidak umum digunakan), anda bisa menulis:
CREATE TABLE someone.table ( ... )
dan pemilik nama dalam katalog sistem akan menjadi "ORANG", bukan 'seseorang'. Jika anda menyertakan nama pemilik dalam tanda kutip ganda, itu bertindak seperti sebuah identifier yang dipisahkan. Dengan standar SQL, yang dibatasi dengan tanda pengenal yang dapat digunakan di banyak tempat. Dengan Informix, anda dapat menggunakannya hanya sekitar pemilik nama-nama-dalam konteks lain, Informix memperlakukan kedua single-quoted dan double-quoted string sebagai string, bukan memisahkan single-quoted string sebagai string dan double-quoted string dibatasi sebagai pengenal. (Tentu saja, hanya untuk kelengkapan, ada variabel lingkungan, DELIMIDENT, yang dapat diatur untuk nilai apapun, tapi Y adalah yang paling aman - untuk menunjukkan bahwa tanda kutip ganda selalu mengelilingi dibatasi pengenal dan tanda kutip tunggal selalu mengelilingi string.)
Perhatikan bahwa MS SQL Server berhasil menggunakan [dibatasi pengenal] tertutup dalam tanda kurung siku. Ini terlihat aneh bagi saya, dan ini tentunya bukan merupakan bagian dari SQL standar.
Untuk menambahkan sesuatu dalam jawaban pertama, ketika kita ingin hanya beberapa data dari tabel lain (dalam contoh ini hanya salah satu):
INSERT INTO TABLE1
(COLUMN1, COLUMN2, COLUMN3, COLUMN4)
VALUES (value1, value2,
(SELECT COLUMN_TABLE2
FROM TABLE2
WHERE COLUMN_TABLE2 like "blabla"),
value4);
Sebagian besar database yang mengikuti sintaks dasar,
INSERT INTO TABLE_NAME
SELECT COL1, COL2 ...
FROM TABLE_YOU_NEED_TO_TAKE_FROM
;
Setiap database yang saya telah digunakan mengikuti sintaks ini yaitu, DB2
, SQL Server
, MY SQL
, PostgresQL
Hal ini dapat dilakukan tanpa menentukan kolom di INSERT INTO
bagian jika anda menyediakan nilai-nilai untuk semua kolom di bagian SELECT
.
Let's mengatakan table1 memiliki dua kolom. Query ini harus bekerja:
INSERT INTO table1
SELECT col1, col2
FROM table2
Ini TIDAK AKAN bekerja (nilai col2
tidak ditentukan):
INSERT INTO table1
SELECT col1
FROM table2
I'm menggunakan MS SQL Server. Saya don't tahu cara lain RDMS bekerja.
Sederhana penyisipan ketika kolom tabel urutan dikenal:
Insert into Table1
values(1,2,...)
Sederhana penyisipan menyebutkan kolom:
Insert into Table1(col2,col4)
values(1,2)
Massal penyisipan ketika jumlah kolom yang dipilih dari tabel(#table2) adalah sama dengan penyisipan tabel(Table1)
Insert into Table1 {Column sequence}
Select * -- column sequence should be same.
from #table2
Massal penyisipan ketika anda ingin memasukkan ke kolom yang diinginkan dari sebuah tabel(table1):
Insert into Table1 (Column1,Column2 ....Desired Column from Table1)
Select Column1,Column2..desired column from #table2
from #table2
Dua pendekatan untuk menyisipkan ke dalam dengan memilih sub-query.
1. Pendekatan Dengan MEMILIH subquery kembali hasil dengan satu baris.
INSERT INTO <table_name> (<field1>, <field2>, <field3>)
VALUES ('DUMMY1', (SELECT <field> FROM <table_name> ),'DUMMY2');
Dalam hal ini, diasumsikan PILIH Sub-query pengembalian hanya satu baris dari hasil berdasarkan di MANA kondisi atau fungsi agregat SQL seperti SUM, MAX, AVG dll. Jika tidak, ia akan melempar kesalahan
2. Pendekatan Dengan MEMILIH subquery kembali hasil dengan beberapa baris.
INSERT INTO <table_name> (<field1>, <field2>, <field3>)
SELECT 'DUMMY1', <field>, 'DUMMY2' FROM <table_name>;
Kedua pendekatan ini akan bekerja untuk kedua kasus.
Berikut ini's bagaimana untuk menyisipkan dari beberapa tabel. Contoh khusus ini adalah di mana anda memiliki sebuah tabel pemetaan di banyak ke banyak skenario:
insert into StudentCourseMap (StudentId, CourseId)
SELECT Student.Id, Course.Id FROM Student, Course
WHERE Student.Name = 'Paddy Murphy' AND Course.Name = 'Basket weaving for beginners'
(Saya menyadari pencocokan pada nama mahasiswa dapat mengembalikan lebih dari satu nilai tetapi anda mendapatkan ide. Pencocokan pada sesuatu yang lain dari Id ini diperlukan ketika Id adalah Identitas kolom dan tidak diketahui.)
Berikut adalah contoh lain di mana sumber diambil menggunakan lebih dari satu tabel:
INSERT INTO cesc_pf_stmt_ext_wrk(
PF_EMP_CODE ,
PF_DEPT_CODE ,
PF_SEC_CODE ,
PF_PROL_NO ,
PF_FM_SEQ ,
PF_SEQ_NO ,
PF_SEP_TAG ,
PF_SOURCE)
SELECT
PFl_EMP_CODE ,
PFl_DEPT_CODE ,
PFl_SEC ,
PFl_PROL_NO ,
PF_FM_SEQ ,
PF_SEQ_NO ,
PFl_SEP_TAG ,
PF_SOURCE
FROM cesc_pf_stmt_ext,
cesc_pfl_emp_master
WHERE pfl_sep_tag LIKE '0'
AND pfl_emp_code=pf_emp_code(+);
COMMIT;
Hanya menggunakan tanda kurung untuk PILIH klausul ke INSERT. Misalnya seperti ini :
INSERT INTO Table1 (col1, col2, your_desired_value_from_select_clause, col3)
VALUES (
'col1_value',
'col2_value',
(SELECT col_Table2 FROM Table2 WHERE IdTable2 = 'your_satisfied_value_for_col_Table2_selected'),
'col3_value'
);
Untuk Microsoft SQL Server, saya akan merekomendasikan belajar untuk menafsirkan SINTAKS yang disediakan di MSDN. Dengan Google itu's lebih mudah dari sebelumnya, untuk mencari sintaks.
Untuk kasus ini, mencoba
Google: menyisipkan site:microsoft.com
Hasil pertama akan http://msdn.microsoft.com/en-us/library/ms174335.aspx
gulir ke bawah untuk contoh ("Menggunakan MEMILIH dan MENGEKSEKUSI opsi untuk memasukkan data dari tabel lain") jika anda menemukan sulit untuk menafsirkan sintaks yang diberikan di bagian atas halaman.
[ WITH <common_table_expression> [ ,...n ] ]
INSERT
{
[ TOP ( expression ) [ PERCENT ] ]
[ INTO ]
{ <object> | rowset_function_limited
[ WITH ( <Table_Hint_Limited> [ ...n ] ) ]
}
{
[ ( column_list ) ]
[ <output Clause> ]
{ VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n ]
| derived_table <<<<------- Look here ------------------------
| execute_statement <<<<------- Look here ------------------------
| <dml_table_source> <<<<------- Look here ------------------------
| DEFAULT VALUES
}
}
}
[;]
Ini harus berlaku untuk setiap RDBMS lain yang tersedia di sana. Tidak ada gunanya mengingat semua sintaks untuk semua produk IMO.
Aku benar-benar sukai berikut di SQL Server 2008:
SELECT Table1.Column1, Table1.Column2, Table2.Column1, Table2.Column2, 'Some String' AS SomeString, 8 AS SomeInt
INTO Table3
FROM Table1 INNER JOIN Table2 ON Table1.Column1 = Table2.Column3
Menghilangkan langkah untuk menambahkan Insert () set, dan anda hanya memilih nilai-nilai yang pergi di atas meja.
select *
into tmp
from orders
Terlihat bagus, tetapi hanya bekerja jika tmp doesn't ada (menciptakan dan mengisi). (SQL sever)
Untuk menyisipkan ke dalam ada tmp tabel:
set identity_insert tmp on
insert tmp
([OrderID]
,[CustomerID]
,[EmployeeID]
,[OrderDate]
,[RequiredDate]
,[ShippedDate]
,[ShipVia]
,[Freight]
,[ShipName]
,[ShipAddress]
,[ShipCity]
,[ShipRegion]
,[ShipPostalCode]
,[ShipCountry] )
select * from orders
set identity_insert tmp off