Menggabungkan data berdasarkan beberapa tabel

Selesai

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 diubah disebut sebagai tabel target. Tabel yang digunakan untuk menentukan baris mana yang akan diubah 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);