Flet data baseret på flere tabeller

Fuldført

I databasehandlinger er der nogle gange behov for at udføre en SQL MERGE-handling. Med denne DML-indstilling kan du synkronisere to tabeller ved at indsætte, opdatere eller slette rækker i én tabel baseret på forskelle, der findes i den anden tabel. Den tabel, der ændres, kaldes destinationstabellen . Den tabel, der bruges til at bestemme, hvilke rækker der skal ændres, kaldes kildetabellen .

MERGE ændrer data baseret på en eller flere betingelser:

  • Når kildedataene har en tilsvarende række i destinationstabellen, kan de opdatere data i destinationstabellen.
  • Når kildedataene ikke stemmer overens i destinationen, kan de indsætte data i destinationstabellen.
  • Når destinationsdataene ikke stemmer overens i kilden, kan de slette destinationsdataene.

Den generelle syntaks for en MERGE-sætning er vist nedenfor. Vi matcher målet og kilden i en angivet kolonne, og hvis der er et match mellem destination og kilde, angiver vi en handling, der skal udføres på destinationstabellen. Hvis der ikke er et match, angiver vi en handling. Handlingen kan være en INSERT-, UPDATE- eller DELETE-handling. Denne kode angiver, at der udføres en OPDATERING, når der er et match mellem kilden og målet. Der udføres en INSERT, når der er data i kilden uden tilsvarende data i destinationen. Endelig udføres en DELETE, når der er data i destinationen uden match i kilden. Der er mange andre mulige former for en MERGE-sætning.

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;

Du kan kun bruge elementerne i den MERGE-sætning, du har brug for. Lad os f.eks. antage, at databasen indeholder en tabel med faseopdaterede fakturaopdateringer, der omfatter en blanding af ændringer af eksisterende fakturaer og nye fakturaer. Du kan bruge delsætningerne WHEN MATCHED og WHEN NOT MATCHED til at opdatere eller indsætte fakturadata efter behov.

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