Menggabungkan data berdasarkan beberapa tabel
Dalam operasi database, terkadang ada kebutuhan untuk melakukan operasi SQL MERGE. Opsi DML ini memungkinkan Anda untuk menyinkronkan dua tabel dengan menyisipkan, memperbarui, atau menghapus baris dalam satu tabel berdasarkan perbedaan yang ditemukan di tabel lainnya. Tabel yang sedang dimodifikasi disebut sebagai tabel target . Tabel yang digunakan untuk menentukan baris mana yang akan diubah yang disebut tabel sumber .
MERGE mengubah data, berdasarkan satu atau beberapa kondisi:
- Saat data sumber memiliki baris yang cocok di tabel target, data tersebut dapat memperbarui data di tabel target.
- Saat data sumber tidak cocok dengan target, data tersebut dapat memasukkan data ke tabel target.
- Saat data target tidak cocok dengan sumbernya, data tersebut dapat menghapus data target.
Sintaksis umum dari pernyataan MERGE diperlihatkan di bawah ini. Kita mencocokkan target dan sumber pada kolom yang ditentukan, dan jika ada kecocokan antara target dan sumber, kita tentukan tindakan yang akan dilakukan pada tabel target. Jika tidak ada kecocokan, kita tentukan tindakan. Tindakan dapat berupa operasi INSERT, UPDATE, atau DELETE. Kode ini menunjukkan bahwa UPDATE dilakukan saat ada kecocokan antara sumber dan target. INSERT dilakukan saat ada data di sumber tanpa data yang cocok di target. Akhirnya, DELETE dilakukan saat ada data di target tanpa kecocokan di sumbernya. Ada banyak kemungkinan bentuk pernyataan MERGE lainnya.
MERGE INTO schema_name.table_name AS TargetTbl
USING (SELECT <select_list>) AS SourceTbl
ON (TargetTbl.col1 = SourceTbl.col1)
WHEN MATCHED THEN
UPDATE SET TargetTbl.col2 = SourceTbl.col2
WHEN NOT MATCHED [BY TARGET] THEN
INSERT (<column_list>)
VALUES (<value_list>)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
Anda hanya dapat menggunakan elemen pernyataan MERGE yang Anda butuhkan. Misalnya, database menyertakan tabel pembaruan faktur bertahap, yang mencakup campuran revisi faktur yang ada dan faktur baru. Anda dapat menggunakan klausul WHEN MATCHED dan WHEN NOT MATCHED untuk memperbarui atau menyisipkan data faktur sesuai kebutuhan.
MERGE INTO Sales.Invoice as i
USING Sales.InvoiceStaging as s
ON i.SalesOrderID = s.SalesOrderID
WHEN MATCHED THEN
UPDATE SET i.CustomerID = s.CustomerID,
i.OrderDate = GETDATE(),
i.PurchaseOrderNumber = s.PurchaseOrderNumber,
i.TotalDue = s.TotalDue
WHEN NOT MATCHED THEN
INSERT (SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue)
VALUES (s.SalesOrderID, s.CustomerID, s.OrderDate, s.PurchaseOrderNumber, s.TotalDue);
Note
Pernyataan ini MERGE menggunakan mekanisme penguncian yang berbeda dari pernyataan , , UPDATEdan DELETE diskritINSERT. Dalam skala besar, MERGE mungkin memperkenalkan masalah konkurensi yang rumit, jadi uji pernyataan apa pun MERGE secara menyeluruh sebelum menyebarkannya ke produksi. Saat Anda hanya memperbarui satu tabel berdasarkan baris pernyataan lain, terpisah INSERT, UPDATE, dan DELETE dapat menawarkan performa dan skalabilitas yang lebih baik. Untuk informasi selengkapnya, lihat Pertimbangan konkurensi untuk MERGE.