Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara menggunakan UPDATE dari SELECT di SQL Server

Pada artikel ini, kita akan membahas metode yang berbeda untuk menggunakan pernyataan UPDATE dari SELECT di SQL Server.

Di dunia database, data statis biasanya tidak disimpan. Sebaliknya, itu terus berubah ketika kami memperbarui data yang ada, mengarsipkan atau menghapus data yang tidak relevan dan banyak lagi. Misalnya, katakanlah Anda memiliki tabel yang menyimpan data harga produk untuk portal belanja Anda. Harga produk terus berubah, karena Anda mungkin menawarkan diskon produk pada waktu yang berbeda kepada pelanggan Anda. Dalam hal ini, Anda tidak dapat menambahkan baris baru dalam tabel karena catatan produk sudah ada, tetapi Anda harus memperbarui harga saat ini untuk produk yang sudah ada.

Di sinilah kueri UPDATE berperan. Kueri UPDATE memodifikasi data dalam baris yang ada di database. Anda dapat memperbarui semua baris tabel atau membatasi baris yang terpengaruh untuk pembaruan menggunakan klausa WHERE. Biasanya, pembaruan SQL dilakukan untuk tabel yang ada dengan referensi langsung. Misalnya, dalam tabel [karyawan], persyaratan harus menaikkan gaji semua karyawan aktif sebesar 10%. Dalam hal ini, kueri SQL referensi langsung akan menjadi:

Perbarui set karyawan [gaji]=gaji + (gaji * 10 / 100)  di mana [aktif]=1

Misalkan Anda memiliki tabel [Alamat] lain yang menyimpan lokasi karyawan dan Anda diharuskan memperbarui tabel [Karyawan] berdasarkan data yang tersedia di tabel [Alamat]. Bagaimana Anda memperbarui data di tabel [Karyawan]?

Untungnya, ada solusi – UPDATE dari pernyataan SELECT. Di bagian berikut, kita melihat berbagai cara untuk melakukan pembaruan menggunakan pernyataan SELECT. Misalnya, tabel [Karyawan] memiliki nilai NULL untuk kolom – [Kode Pos] dan [Kota] pada tangkapan layar berikut. Tabel [Alamat] memiliki nilai untuk kolom [Kode Pos] dan [Kota].

Metode 1:PERBARUI dari SELECT:Metode Gabung

Metode ini menggunakan Gabungan SQL untuk mereferensikan tabel sekunder yang berisi nilai yang perlu diperbarui. Oleh karena itu, tabel target diperbarui dengan data kolom referensi untuk kondisi yang ditentukan.

Cukup mudah untuk menggunakan pernyataan UPDATE dari SELECT dalam contoh ini. Anda dapat menggunakan pernyataan SELECT terlebih dahulu untuk mengambil kolom referensi dan nilai kolom target.

SELECT e.City,A.City, e.PostCode,A.PostCode
FROM Employee e
INNER JOIN
[Address] a
ON e.EmpID = A.EmpID

Selanjutnya, Anda akan melakukan sedikit perubahan pada kueri Anda, dan itu akan menyiapkan pernyataan UPDATE seperti yang ditunjukkan di bawah ini.

  1. Ganti kata kunci pilihan dengan pembaruan.
  2. Tentukan nama tabel atau nama alias yang perlu diperbarui.
  3. Gunakan kata kunci yang ditetapkan dan simbol sama dengan (=) antara kolom referensi dan target.
UPDATE e set
e.City=A.City,
e.PostCode=A.PostCode
FROM Employee e
INNER JOIN [Address] a
ON e.EmpID = A.EmpID

Kemudian jalankan pernyataan UPDATE dan verifikasi bahwa nilai kolom sumber dan target adalah sama.

Metode 2:UPDATE dari SELECT:Pernyataan MERGE

Pernyataan MERGE berguna untuk memanipulasi data dalam tabel target berdasarkan data tabel sumber untuk baris yang cocok dan tidak cocok. Ini adalah metode alternatif untuk melakukan UPDATE dari fungsi pernyataan SELECT.

Dalam contoh pernyataan MERGE di bawah ini, tugas-tugas berikut dilakukan:

  • Gunakan pernyataan MERGE untuk memperbarui data di tabel [Karyawan].
  • Ini kemudian mereferensikan tabel lain ketika klausa USING diterapkan.
  • WEN MATCHED kemudian menentukan gabungan JOIN (Inner Join) antara tabel sumber dan target.
  • Ini kemudian memperbarui [Kode Pos] dan [Kota] dari tabel [Alamat] ke tabel [Karyawan] menggunakan pernyataan THEN UPDATE diikuti dengan pemetaan kolom sumber dan target.
  • Pernyataan MERGE selalu diakhiri dengan titik koma(;).
MERGE Employee AS e
USING(SELECT * FROM [Address]) AS A
ON A.EmpID=e.EmpID
WHEN MATCHED THEN UPDATE SET
e.PostCode=A.PostCode ,
e.City = A.City;

Metode 3:UPDATE dari SELECT:Metode subquery

Subkueri menentukan kueri internal yang dapat digunakan di dalam pernyataan SELECT, INSERT, UPDATE, dan DELETE. Ini adalah metode langsung untuk memperbarui data tabel yang ada dari tabel lain.

UPDATE Employee
SET Employee.City=(SELECT [Address].city
FROM [Address]
WHERE [Address].EmpID = Employee.EmpId)
  • Kueri di atas menggunakan pernyataan SELECT dalam klausa SET dari pernyataan UPDATE.
  • Jika subkueri menemukan baris yang cocok, kueri pembaruan akan memperbarui catatan untuk karyawan tertentu.
  • Jika subquery mengembalikan NULL (tidak ada baris yang cocok), subquery akan memperbarui NULL untuk masing-masing kolom.
  • Jika subquery mengembalikan lebih dari satu baris yang cocok, pernyataan UPDATE menimbulkan kesalahan – “Subquery SQL Server mengembalikan lebih dari 1 nilai. Ini tidak diizinkan ketika subkueri menggunakan operator perbandingan(=, !=, <, <=,>,>=).”

Batasan subkueri

  • Subkueri dengan operator perbandingan hanya dapat menyertakan satu nama kolom kecuali jika digunakan untuk operator IN atau EXISTS. Oleh karena itu, jika kita perlu memperbarui beberapa kolom data, kita memerlukan pernyataan SQL yang terpisah.
  • Anda tidak dapat menggunakan ntextteks , dan gambar tipe data dalam subkueri.
  • Subquery tidak dapat menyertakan GROUP BY dan klausa HAVING jika subquery berisi operator perbandingan yang tidak dimodifikasi. Operator perbandingan yang tidak dimodifikasi tidak dapat menggunakan kata kunci APAPUN atau SEMUA.

Perbandingan kinerja antara UPDATE yang berbeda dari pernyataan SELECT

Di bagian ini, kami akan membuat perbandingan kinerja antara UPDATE yang berbeda dari metode SELECT. Untuk melakukannya, kita akan mulai dengan mengeksekusi kueri SQL bersama-sama, mengaktifkan rencana eksekusi yang sebenarnya (Ctrl + M) di SQL Server Management Studio dan memisahkannya menggunakan pernyataan Go.

Dalam rencana eksekusi, saya mendapatkan data berikut untuk demo saya:

  • Metode Gabung memiliki biaya kueri 41% (relatif terhadap keseluruhan batch)
  • Pernyataan MERGE memiliki biaya kueri 34% (relatif terhadap kumpulan keseluruhan)
  • Metode subkueri memiliki biaya kueri 24% (relatif terhadap keseluruhan batch)

Metode JOIN menggunakan biaya 40% untuk pengurutan yang berbeda dan biaya 35% untuk pembaruan indeks berkerumun.

Gabung gabungan menggunakan gabungan dalam untuk mencocokkan baris data antara data sumber dan target. Ini juga memiliki biaya relatif maksimum untuk operator sortir.

Subquery adalah metode tercepat untuk memperbarui data kolom. Ini menggunakan pembaruan indeks berkerumun dan pemindaian indeks berkerumun seperti yang disorot.

Untuk detail selengkapnya, Anda dapat merujuk ke artikel saya sebelumnya: Rencana Eksekusi SQL Server — Apa itu dan Bagaimana Cara Membantu Masalah Performa? dan Cara Membaca dan Menganalisis Paket Eksekusi SQL Server.

Ringkasan

Anda dapat menggunakan metode apa pun yang ditentukan dalam artikel ini untuk melakukan UPDATE dari pernyataan SELECT. Subquery bekerja secara efisien, tetapi memiliki keterbatasannya sendiri, seperti yang disorot sebelumnya. Performa keseluruhan database Anda bergantung pada data tabel, jumlah pembaruan, hubungan tabel, indeks, dan statistik.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Haruskah saya menggunakan aturan CASCADE DELETE?

  2. Streaming Gambar Basis Data Menggunakan HttpHandler

  3. T-SQL:Menghapus semua baris duplikat tetapi menyimpannya

  4. Bagaimana menemukan baris berurutan berdasarkan nilai kolom?

  5. Permintaan CPU TOP Kinerja SQL Server -1