מיזוג נתונים בהתבסס על טבלאות מרובות

הושלם

בפעולות מסד נתונים, לפעמים יש צורך לבצע פעולת מיזוג SQL. אפשרות DML זו מאפשרת לך לסנכרן שתי טבלאות על-ידי הוספה, עדכון או מחיקה של שורות בטבלה אחת בהתבסס על הבדלים שנמצאו בטבלה האחרת. הטבלה המעודפת נקראת טבלת היעד. הטבלה המשמשת לקביעת השורות שיש לשנות נקראות טבלת המקור.

מיזוג משנה נתונים, בהתבסס על תנאי אחד או יותר:

  • כאשר נתוני המקור מכילים שורה תואמת בטבלת היעד, הם יכולים לעדכן נתונים בטבלת היעד.
  • כאשר נתוני המקור אינם תואמים ליעד, הם יכולים להוסיף נתונים לטבלת היעד.
  • כאשר נתוני היעד אינם תואמים במקור, הם יכולים למחוק את נתוני היעד.

התחביר הכללי של משפט MERGE מוצג להלן. אנו תואמים ליעד ולמקור בעמודה שצוינה, ואם קיימת התאמה בין היעד למקור, אנו מציינים פעולה שיש לבצע בטבלת היעד. אם אין התאמה, אנו מציינים פעולה. הפעולה יכולה להיות פעולת INSERT, UPDATE או 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);