Dalam sebagian besar keadaan, pembaruan SQL dilakukan menggunakan referensi langsung ke tabel tertentu (UPDATE books SET books.title = 'The Hobbit' WHERE books.id = 1
). Namun, terkadang, mungkin terbukti bermanfaat untuk mengubah isi tabel secara tidak langsung , dengan menggunakan subset data yang diperoleh dari pernyataan kueri sekunder.
Melakukan UPDATE
menggunakan SELECT
sekunder pernyataan dapat dicapai dengan salah satu dari dua cara, terutama tergantung pada versi SQL Server yang Anda gunakan. Kami akan menjelajahi kedua opsi secara singkat sehingga Anda dapat menemukan yang terbaik untuk Anda.
Menggunakan INNER JOIN
Untuk semua instalasi SQL Server, metode paling dasar untuk melakukan tindakan ini adalah dengan menggunakan INNER JOIN
, dimana nilai dalam kolom dari dua tabel yang berbeda dibandingkan satu sama lain.
UPDATE
books
SET
books.primary_author = authors.name
FROM
books
INNER JOIN
authors
ON
books.author_id = authors.id
WHERE
books.title = 'The Hobbit'
Dalam contoh di atas, kami UPDATING
books.primary_author
untuk mencocokkan authors.name
untuk 'The Hobbit' dengan JOINING
kedua tabel dalam kueri ke masing-masing, nilai yang cocok dari authors.id
dan books.author_id
.
Menggunakan MERGE untuk MEMPERBARUI dan INSERT Secara Bersamaan
Untuk SQL Server 2008 dan yang lebih baru, Microsoft memperkenalkan MERGE
. yang sangat berguna operasi yang mirip dengan INNER JOIN
di atas metode, tetapi MERGE
mencoba melakukan keduanya UPDATE
dan INSERT
perintah bersama. Ini secara efektif menyinkronkan dua tabel berdasarkan kueri yang dilakukan, memperbarui, dan memasukkan catatan seperlunya agar keduanya cocok.
MERGE INTO
books
USING
authors
ON
books.author_id = authors.id
WHEN MATCHED THEN
UPDATE SET
books.primary_author = authors.name
WHEN NOT MATCHED THEN
INSERT
(books.author_id, books.primary_author)
VALUES
(authors.id, authors.name)
Kueri lengkap saat menggunakan MERGE
tentunya sedikit lebih kompleks daripada INNER JOIN
dasar , tetapi begitu Anda memahami cara kerja operasi, Anda akan segera memahami betapa hebatnya kemampuan ini sebenarnya.
Beberapa baris pertama cukup jelas:
MERGE INTO
books
USING
authors
ON
books.author_id = authors.id
Kami ingin MERGE INTO
(UPDATE
/INSERT
) books
tabel dengan menggunakan authors
sekunder tabel, dan kami mencocokkan keduanya berdasarkan books.author_id = authors.id
yang sama perbandingan.
Dimana MERGE
perintah yang berbeda ada pada logika percabangan berikut.
WHEN MATCHED THEN
UPDATE SET
books.primary_author = authors.name
Di sini kami meminta SQL untuk melakukan tindakan hanya ketika merekam MATCHED
– ketika catatan yang ada ditemukan. Dalam hal ini, kami melakukan UPDATE
standar seperti yang kita lakukan sebelumnya, menyetel books.primary_author
bidang agar sama dengan authors.name
lapangan.
Terakhir, jika kueri menemukan catatan komparatif yang cocok yang tidak ada, kami malah melakukan INSERT
.
WHEN NOT MATCHED THEN
INSERT
(books.author_id, books.primary_author)
VALUES
(authors.id, authors.name)
Di sini kami hanya meminta SQL untuk INSERT
rekor baru ke dalam books
tabel dan meneruskan nilai untuk author_id
dan primary_author
bidang, diambil dari authors
terkait catatan tabel.
Hasil akhir dari MERGE
our kami pernyataannya adalah untuk setiap penulis di authors
tabel, kami memverifikasi apakah buku yang sesuai ada di books
. Jika catatan ditemukan, kami memastikan books.primary_author
diatur menggunakan UPDATE
, dan jika tidak ditemukan kecocokan, kami menambahkan catatan baru ke books
.
Dengan itu, Anda harus memiliki pemahaman yang kuat tentang dua metode berbeda yang dapat digunakan untuk UPDATE
catatan dalam SQL dengan menggunakan SELECT
sekunder, komparatif pernyataan.