Di SQL Server , dimungkinkan untuk INSERT
menjadi tabel menggunakan SELECT
pernyataan:
INSERT INTO Table (col1, col2, col3)
SELECT col1, col2, col3
FROM other_table
WHERE sql = 'cool'
Apakah mungkin untuk memperbarui melalui SELECT
? Saya memiliki tabel sementara yang berisi nilai-nilai dan ingin memperbarui tabel lain menggunakan nilai-nilai itu. Mungkin kira-kira seperti ini:
UPDATE Table SET col1, col2
SELECT col1, col2
FROM other_table
WHERE sql = 'cool'
WHERE Table.id = other_table.id
sql
sql-server
tsql
select
jamesmhaley
sumber
sumber
SET Table.other_table_id = @NewValue
) maka ubah pernyataan ON ke sesuatu sepertiON Table.id = @IdToEdit AND other_table.id = @NewValue
Di SQL Server 2008 (atau lebih baik), gunakan
MERGE
Kalau tidak:
sumber
MERGE
juga dapat digunakan untuk catatan "Upserting"; yaitu,UPDATE
jika ada catatan yang cocok,INSERT
catatan baru jika tidak ada yang cocokUPDATE
daripadaMERGE
, orang-orang baru saja belajar untuk hidup bersama mereka dan mereka menjadi bagian dari lanskap ('fitur'). Pertimbangkan bahwa blog tidak ada kapanUPDATE
anak baru di blok.sumber
SET Table_A.col1 = SUM(Table_B.col1)
(atau fungsi agregat lainnya). Jadi lebih baik daripada jawaban Robin Day untuk tujuan ini.Saya akan memodifikasi jawaban Robin yang luar biasa untuk yang berikut:
Tanpa klausa WHERE, Anda akan memengaruhi bahkan baris yang tidak perlu terpengaruh, yang dapat (mungkin) menyebabkan penghitungan ulang indeks atau pemicu kebakaran yang benar-benar tidak boleh dipecat.
sumber
WHERE EXISTS(SELECT T1.Col1, T1.Col2 EXCEPT SELECT T2.Col1, T2.Col2))
lebih ringkas.Satu arah
sumber
Kemungkinan lain yang belum disebutkan adalah hanya membuang
SELECT
pernyataan itu sendiri ke dalam CTE dan kemudian memperbarui CTE.Ini memiliki manfaat yang mudah dijalankan
SELECT
pernyataan sendiri terlebih dahulu untuk memeriksa hasilnya, tetapi mengharuskan Anda untuk alias kolom seperti di atas jika mereka diberi nama yang sama dalam tabel sumber dan target.Ini juga memiliki batasan yang sama dengan
UPDATE ... FROM
sintaksis berpemilik yang ditunjukkan pada empat jawaban lainnya. Jika tabel sumber ada di banyak sisi dari satu-ke-banyak bergabung maka itu tidak ditentukan mana dari catatan yang cocok mungkin akan digunakan dalamUpdate
(masalah yangMERGE
menghindari dengan meningkatkan kesalahan jika ada upaya untuk memperbarui baris yang sama lebih dari sekali).sumber
CTE
?;WITH SomeCompexCTE AS (...), CTEAsAbove AS (SELECT T1.Col1,... FROM T1 JOIN SomeComplexCTE...) UPDATE CTEAsAbove SET Col1=_Col1, ...
Sebagai catatan (dan orang lain yang mencari seperti saya), Anda dapat melakukannya di MySQL seperti ini:
sumber
Menggunakan alias:
sumber
Cara sederhana untuk melakukannya adalah:
sumber
Ini mungkin menjadi alasan khusus untuk melakukan pembaruan (misalnya, terutama digunakan dalam prosedur), atau mungkin jelas bagi orang lain, tetapi juga harus dinyatakan bahwa Anda dapat melakukan pernyataan pilih-pembaruan tanpa menggunakan gabungan (jika tabel yang Anda perbarui tidak memiliki bidang yang sama).
sumber
Berikut ini sintaks yang berguna:
Ia memeriksa apakah itu nol atau tidak dengan menggunakan "WHERE EXIST".
sumber
Saya menambahkan ini hanya agar Anda dapat melihat cara cepat untuk menulisnya sehingga Anda dapat memeriksa apa yang akan diperbarui sebelum melakukan pembaruan.
sumber
Jika Anda menggunakan MySQL daripada SQL Server, sintaksnya adalah:
sumber
PEMBARUAN dari SELECT dengan INNER BERGABUNG dalam SQL Database
Karena ada terlalu banyak balasan dari posting ini, yang paling banyak dipilih, saya pikir saya akan memberikan saran saya di sini juga. Meskipun pertanyaannya sangat menarik, saya telah melihat di banyak situs forum dan membuat solusi menggunakan INNER JOIN dengan screenshot.
Pada awalnya, saya telah membuat tabel dengan nama schoolold dan menyisipkan beberapa catatan sehubungan dengan nama kolom mereka dan menjalankannya.
Kemudian saya menjalankan perintah SELECT untuk melihat catatan yang dimasukkan.
Kemudian saya membuat tabel baru dengan nama schoolnew dan melakukan tindakan yang sama di atasnya.
Kemudian, untuk melihat catatan yang dimasukkan di dalamnya, saya menjalankan perintah SELECT.
Sekarang, Di sini saya ingin membuat beberapa perubahan di baris ketiga dan keempat, untuk menyelesaikan tindakan ini, saya menjalankan perintah UPDATE dengan INNER JOIN .
Untuk melihat perubahan, saya menjalankan perintah SELECT .
Anda dapat melihat bagaimana catatan ketiga dan keempat dari table schoolold mudah diganti dengan table schoolnew dengan menggunakan INNER BERGABUNG dengan pernyataan UPDATE.
sumber
Dan jika Anda ingin bergabung dengan tabel itu sendiri (yang tidak akan terlalu sering terjadi):
sumber
targett1
dansourcet1
bukan (atau juga) komentar.Contoh berikut menggunakan tabel turunan, pernyataan SELECT setelah klausa FROM, untuk mengembalikan nilai lama dan baru untuk pembaruan lebih lanjut:
sumber
Memperbarui melalui
CTE
lebih mudah dibaca daripada jawaban lain di sini:sumber
Jika Anda menggunakan SQL Server, Anda dapat memperbarui satu tabel dari yang lain tanpa menentukan gabungan dan cukup menghubungkan keduanya dari
where
klausa. Ini membuat kueri SQL yang lebih sederhana:sumber
Menggabungkan semua pendekatan berbeda di sini.
Struktur tabel contoh di bawah dan akan diperbarui dari Product_BAK ke tabel Produk.
Produk
Product_BAK
1. Pilih pembaruan
2. Perbarui dengan ekspresi tabel umum
3. Gabung
Dalam pernyataan Gabung ini, kita dapat melakukan inset jika tidak menemukan catatan yang cocok di target, tetapi ada di sumber dan silakan temukan sintaks:
sumber
Cara lain adalah dengan menggunakan tabel turunan:
Contoh data
sumber
Untuk memastikan Anda memperbarui apa yang Anda inginkan, pilih terlebih dahulu
sumber
Bahkan ada metode yang lebih pendek dan mungkin mengejutkan bagi Anda:
Kumpulan data sampel:
Kode:
sumber
Menggunakan:
ANTARA:
ATAU:
Jika nama kolom ID sama di kedua tabel maka cukup letakkan nama tabel sebelum tabel diperbarui dan gunakan alias untuk tabel yang dipilih, yaitu:
sumber
Dalam jawaban yang diterima, setelah:
Saya akan menambahkan:
Apa yang biasanya saya lakukan adalah meletakkan segala sesuatu dalam transaksi yang didukung dan menggunakan
"OUTPUT"
: dengan cara ini saya melihat segala sesuatu yang akan terjadi. Ketika saya senang dengan apa yang saya lihat, saya mengubahnyaROLLBACK
menjadiCOMMIT
.Saya biasanya perlu mendokumentasikan apa yang saya lakukan, jadi saya menggunakan
"results to Text"
opsi ketika saya menjalankan permintaan yang didukung roll dan saya menyimpan skrip dan hasil OUTPUT. (Tentu saja ini tidak praktis jika saya mengubah terlalu banyak baris)sumber
sumber
Solusi di bawah ini berfungsi untuk database MySQL:
sumber
Cara lain untuk memperbarui dari pernyataan pilih:
sumber
Opsi 1: Menggunakan Inner Join:
Opsi 2: Permintaan Sub terkait
sumber
Sintaks untuk pernyataan UPDATE saat memperbarui satu tabel dengan data dari tabel lain di SQL Server
sumber
Anda dapat menggunakan ini untuk pembaruan di sql server
sumber