دمج البيانات استنادًا إلى جداول متعددة

مكتمل

في عمليات قاعدة البيانات، هناك أحيانًا حاجة إلى تنفيذ العملية SQL MERGE. يسمح لك خيار DML هذا بمزامنة جدولين عن طريق إدراج صفوف أو تحديثها أو حذفها في جدول واحد استنادًا إلى الاختلافات الموجودة في الجدول الآخر. تتم الإشارة إلى الجدول الذي يتم تعديله على أنه الجدول الهدف. يسمى الجدول المستخدم لتحديد الصفوف التي تريد تغييرها بالجدول المصدر.

يتم من خلال MERGE تعديل البيانات، وذلك استنادًا إلى شرط واحد أو أكثر:

  • عندما تحتوي البيانات المصدر على صف مطابق في الجدول الهدف، يمكن تحديث البيانات في الجدول الهدف.
  • عندما لا يكون للبيانات المصدر تطابق في الهدف، يمكن إدراج البيانات في الجدول الهدف.
  • عندما لا تطابق البيانات الهدف في المصدر، يمكن حذف البيانات الهدف.

يظهر بناء الجملة العام لعبارة MERGE أدناه. نطابق الهدف والمصدر على عمود محدد، وإذا كان هناك تطابق بين الهدف والمصدر، فإننا نحدد إجراءً نتخذه على الجدول الهدف. إذا لم يكن هناك تطابق، نحدد إجراءً. يمكن أن يكون الإجراء عملية INSERT أو UPDATE أو DELETE. تشير هذه التعليمة البرمجية إلى أن يتم تنفيذ UPDATE عند وجود تطابق بين المصدر والهدف. يتم تنفيذ INSERT عند وجود بيانات في المصدر بدون بيانات مطابقة في الهدف. وأخيرًا، يتم تنفيذ DELETE عند وجود بيانات في الهدف دون أي تطابق في المصدر. هناك العديد من النماذج الممكنة الأخرى لعبارة MERGE.

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;

لا يمكنك استخدام سوى عناصر عبارة MERGE التي تحتاج إليها. على سبيل المثال، افترض أن قاعدة البيانات تتضمن جدول تحديثات الفواتير المرحلية، والذي يتضمن مزيجًا من المراجعات للفواتير الحالية والفواتير الجديدة. يمكنك استخدام الجملتين WHEN MATCHED وWHEN NOT MATCHED لتحديث بيانات الفاتورة أو إدراجها كما هو مطلوب.

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);