Saya mencoba INSERT INTO
tabel menggunakan input dari tabel lain. Meskipun ini sepenuhnya layak untuk banyak mesin basis data, saya selalu berjuang untuk mengingat sintaks yang benar untuk SQL
mesin saat ini ( MySQL , Oracle , SQL Server , Informix , dan DB2 ).
Apakah ada sintaks perak-peluru yang berasal dari standar SQL (misalnya, SQL-92 ) yang akan memungkinkan saya untuk memasukkan nilai-nilai tanpa khawatir tentang database yang mendasarinya?
sql
database
syntax
database-agnostic
ansi-sql-92
Claude Houle
sumber
sumber
Jawaban:
Mencoba:
Ini adalah standar ANSI SQL dan harus bekerja pada DBMS apa pun
Ini pasti berfungsi untuk:
sumber
Jawaban Claude Houle : harus berfungsi dengan baik, dan Anda juga dapat memiliki beberapa kolom dan data lain juga:
Saya hanya menggunakan sintaks ini dengan Access, SQL 2000/2005 / Express, MySQL, dan PostgreSQL, jadi itu harus dibahas. Ini juga harus bekerja dengan SQLite3.
sumber
Untuk mendapatkan hanya satu nilai dalam nilai multi
INSERT
dari tabel lain, saya melakukan hal berikut di SQLite3:sumber
INSERT
adalah salah satuVALUES
atauSELECT
pernyataan, bukan keduanya.INSERT INTO ... VALUES ([expr], [expr], ...)
dan salah satu jalur dalam[expr]
adalah{{NOT} EXISTS} ([select-stmt])
- perhatikan bahwa paranthesis di sekitar pernyataan pilih diperlukan ({}
artinya opsional)Kedua jawaban yang saya lihat berfungsi dengan baik di Informix secara khusus, dan pada dasarnya adalah SQL standar. Yaitu, notasi:
berfungsi baik dengan Informix dan, saya harapkan, semua DBMS. (Sekali pada 5 tahun atau lebih yang lalu, ini adalah hal yang tidak selalu didukung oleh MySQL; sekarang memiliki dukungan yang layak untuk sintaks SQL standar semacam ini dan, AFAIK, ini akan berfungsi dengan baik pada notasi ini.) Daftar kolom bersifat opsional tetapi menunjukkan kolom target secara berurutan, sehingga kolom pertama dari hasil SELECT akan masuk ke dalam kolom yang tercantum pertama, dll. Dengan tidak adanya daftar kolom, kolom pertama dari hasil SELECT masuk ke dalam kolom pertama dari tabel target.
Apa yang bisa berbeda antara sistem adalah notasi yang digunakan untuk mengidentifikasi tabel dalam basis data yang berbeda - standar tidak ada hubungannya dengan operasi antar-database (apalagi antar-DBMS). Dengan Informix, Anda dapat menggunakan notasi berikut untuk mengidentifikasi tabel:
Yaitu, Anda dapat menentukan database, secara opsional mengidentifikasi server yang menghosting database itu jika tidak ada di server saat ini, diikuti oleh pemilik opsional, titik, dan akhirnya nama tabel sebenarnya. Standar SQL menggunakan skema jangka untuk apa yang Informix sebut sebagai pemilik. Dengan demikian, di Informix, salah satu notasi berikut dapat mengidentifikasi tabel:
Pemilik secara umum tidak perlu dikutip; namun, jika Anda menggunakan tanda kutip, Anda perlu mengeja nama pemilik dengan benar - itu menjadi case-sensitive. Itu adalah:
semua mengidentifikasi tabel yang sama. Dengan Informix, ada sedikit kesulitan dengan database MODE ANSI, di mana nama pemilik umumnya dikonversi ke huruf besar (informix adalah pengecualian). Artinya, dalam basis data MODE ANSI (tidak umum digunakan), Anda dapat menulis:
dan nama pemilik dalam katalog sistem adalah "SESEORANG", bukan 'seseorang'. Jika Anda menyertakan nama pemilik dalam tanda kutip ganda, itu bertindak seperti pengidentifikasi terbatas. Dengan SQL standar, pengidentifikasi terbatas dapat digunakan di banyak tempat. Dengan Informix, Anda dapat menggunakannya hanya di sekitar nama pemilik - dalam konteks lain, Informix memperlakukan string dengan tanda kutip tunggal dan kutip ganda sebagai string, alih-alih memisahkan string tanda kutip tunggal sebagai string dan string tanda kutip ganda sebagai pengidentifikasi terbatas. (Tentu saja, hanya untuk kelengkapan, ada variabel lingkungan, DELIMIDENT, yang dapat diatur - untuk nilai apa pun, tetapi Y adalah yang paling aman - untuk menunjukkan bahwa tanda kutip ganda selalu mengelilingi pengidentifikasi yang dibatasi dan tanda kutip tunggal selalu mengelilingi string.)
Perhatikan bahwa MS SQL Server berhasil menggunakan [pengidentifikasi terbatas] terlampir dalam tanda kurung siku. Itu terlihat aneh bagi saya, dan tentu saja bukan bagian dari standar SQL.
sumber
Untuk menambahkan sesuatu di jawaban pertama, ketika kita ingin hanya beberapa catatan dari tabel lain (dalam contoh ini hanya satu):
sumber
Sebagian besar database mengikuti sintaks dasar,
Setiap database yang saya telah menggunakan mengikuti sintaks ini yaitu,
DB2
,SQL Server
,MY SQL
,PostgresQL
sumber
Alih-alih
VALUES
bagian dariINSERT
kueri, cukup gunakanSELECT
kueri seperti di bawah ini.sumber
Dua pendekatan untuk dimasukkan ke dalam dengan sub-kueri pilihan.
1. Pendekatan untuk dengan SELECT subquery mengembalikan hasil dengan satu baris .
Dalam hal ini, ia mengasumsikan SELECT Sub-query hanya mengembalikan satu baris hasil berdasarkan kondisi WHERE atau fungsi agregat SQL seperti SUM, MAX, AVG dll. Jika tidak, ia akan menimbulkan kesalahan
2. Pendekatan untuk Dengan SELECT subquery mengembalikan hasil dengan beberapa baris .
Pendekatan kedua akan bekerja untuk kedua kasus.
sumber
Ini dapat dilakukan tanpa menentukan kolom di
INSERT INTO
bagian jika Anda memberikan nilai untuk semua kolom diSELECT
bagian.Katakanlah table1 memiliki dua kolom. Kueri ini seharusnya berfungsi:
Ini TIDAK AKAN berfungsi (nilai untuk
col2
tidak ditentukan):Saya menggunakan MS SQL Server. Saya tidak tahu cara kerja RDMS lainnya.
sumber
Ini adalah contoh lain menggunakan nilai dengan pilih:
sumber
Penyisipan sederhana ketika urutan kolom tabel diketahui:
Kolom penyebutan penyisipan sederhana:
Penyisipan massal ketika jumlah kolom yang dipilih dari tabel (# table2) sama dengan tabel penyisipan (Table1)
Penyisipan massal ketika Anda ingin memasukkan hanya ke kolom tabel yang diinginkan (table1):
sumber
Berikut adalah contoh lain di mana sumber diambil menggunakan lebih dari satu tabel:
sumber
Cukup gunakan tanda kurung untuk klausa SELECT ke dalam INSERT. Misalnya seperti ini:
sumber
Berikut cara memasukkan dari beberapa tabel. Contoh khusus ini adalah di mana Anda memiliki tabel pemetaan dalam skenario banyak ke banyak:
(Saya menyadari bahwa pencocokan pada nama siswa mungkin menghasilkan lebih dari satu nilai tetapi Anda mendapatkan idenya. Mencocokkan sesuatu selain ID diperlukan ketika ID adalah kolom Identitas dan tidak diketahui.)
sumber
Ini berfungsi pada semua DBMS
sumber
Anda bisa mencoba ini jika Anda ingin memasukkan semua kolom menggunakan
SELECT * INTO
tabel.sumber
Saya sebenarnya lebih suka yang berikut ini di SQL Server 2008:
Ini menghilangkan langkah menambahkan set Insert (), dan Anda cukup memilih nilai mana yang masuk dalam tabel.
sumber
Ini bekerja untuk saya:
Kalimatnya sedikit berbeda dari Oracle.
sumber
Untuk Microsoft SQL Server, saya akan merekomendasikan belajar menafsirkan SYNTAX yang disediakan pada MSDN. Dengan Google lebih mudah dari sebelumnya, untuk mencari sintaksis.
Untuk kasus khusus ini, cobalah
Hasil pertama adalah http://msdn.microsoft.com/en-us/library/ms174335.aspx
gulir ke bawah ke contoh ("Menggunakan opsi SELECT dan EXECUTE untuk memasukkan data dari tabel lain") jika Anda merasa sulit untuk menafsirkan sintaks yang diberikan di bagian atas halaman.
Ini harus berlaku untuk RDBMS lain yang tersedia di sana. Tidak ada gunanya mengingat semua sintaks untuk semua produk IMO.
sumber
sumber
Terlihat bagus, tetapi hanya berfungsi jika tmp tidak ada (membuatnya dan mengisi). (SQL sever)
Untuk memasukkan ke dalam tabel tmp yang ada:
sumber
Cara terbaik untuk menyisipkan banyak rekaman dari tabel lainnya.
sumber
Jika Anda pergi rute INSERT VALUES untuk menyisipkan beberapa baris, pastikan untuk membatasi VALUES ke dalam set menggunakan tanda kurung, jadi:
Kalau tidak, objek MySQL yang "Jumlah kolom tidak cocok dengan nilai yang dihitung pada baris 1", dan Anda akhirnya menulis posting yang sepele ketika Anda akhirnya tahu apa yang harus dilakukan tentang hal itu.
sumber
JIKA Anda ingin memasukkan beberapa data ke dalam tabel tanpa ingin menulis nama kolom.
Di mana tabelnya adalah:
Hasil:
sumber
Dalam informix itu berfungsi seperti kata Claude:
sumber
Postgres mendukung selanjutnya: buat table company.monitor2 sebagai pilih * dari company.monitor;
sumber