Scalanie danych na podstawie wielu tabel

Ukończone

W operacjach bazy danych czasami konieczne jest wykonanie operacji SCALANIA SQL. Ta opcja DML umożliwia synchronizowanie dwóch tabel przez wstawianie, aktualizowanie lub usuwanie wierszy w jednej tabeli na podstawie różnic znalezionych w drugiej tabeli. Modyfikowana tabela jest określana jako tabela docelowa. Tabela używana do określania, które wiersze do zmiany są nazywane tabelą źródłową.

FUNKCJA MERGE modyfikuje dane na podstawie co najmniej jednego warunków:

  • Gdy dane źródłowe mają pasujący wiersz w tabeli docelowej, mogą aktualizować dane w tabeli docelowej.
  • Gdy dane źródłowe nie są zgodne w obiekcie docelowym, mogą wstawiać dane do tabeli docelowej.
  • Gdy dane docelowe nie są zgodne w źródle, mogą usunąć dane docelowe.

Poniżej przedstawiono ogólną składnię instrukcji MERGE. Dopasowujemy element docelowy i źródło w określonej kolumnie, a jeśli istnieje dopasowanie między elementem docelowym a źródłem, określamy akcję, która ma być wykonywana w tabeli docelowej. Jeśli nie ma dopasowania, określimy akcję. Akcja może być operacją INSERT, UPDATE lub DELETE. Ten kod wskazuje, że aktualizacja jest wykonywana, gdy istnieje dopasowanie między źródłem a obiektem docelowym. Funkcja INSERT jest wykonywana, gdy w źródle znajdują się dane bez pasujących danych w obiekcie docelowym. Na koniec usunięcie jest wykonywane, gdy dane znajdują się w obiekcie docelowym bez dopasowania w źródle. Istnieje wiele innych możliwych form instrukcji 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;

Możesz użyć tylko elementów potrzebnej instrukcji MERGE. Załóżmy na przykład, że baza danych zawiera tabelę aktualizacji faktury etapowej, która zawiera kombinację poprawek istniejących faktur i nowych faktur. Możesz użyć klauzul WHEN MATCHED i WHEN NOT MATCHED, aby zaktualizować lub wstawić dane faktury zgodnie z potrzebami.

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