Scalanie danych na podstawie wielu tabel
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);