Adatok egyesítése több tábla alapján

Befejeződött

Az adatbázis-műveletekben néha szükség van egy SQL MERGE művelet végrehajtására. Ez a DML-beállítás lehetővé teszi két tábla szinkronizálását úgy, hogy sorokat szúr be, frissít vagy töröl az egyik táblában a másik táblában található különbségek alapján. A módosítandó táblát céltáblának nevezzük. A módosítandó sorok meghatározására használt táblát forrástáblának nevezzük.

A MERGE egy vagy több feltétel alapján módosítja az adatokat:

  • Ha a forrásadatoknak van egyező sora a céltáblában, frissíthetik a céltáblában lévő adatokat.
  • Ha a forrásadatok nem egyeznek a célban, adatokat szúrhat be a céltáblába.
  • Ha a céladatok nem egyeznek a forrásban, törölheti a céladatokat.

A MERGE utasítás általános szintaxisa alább látható. Egy adott oszlopban egyeztetjük a célt és a forrást, és ha egyezés van a cél és a forrás között, megadunk egy műveletet a céltáblán. Ha nincs egyezés, megadunk egy műveletet. A művelet lehet INSERT, UPDATE vagy DELETE művelet. Ez a kód azt jelzi, hogy frissítés akkor történik, ha egyezés van a forrás és a cél között. Az INSERT akkor történik, ha a forrásban olyan adatok találhatók, amelyekben nincsenek egyező adatok a célban. Végül a DELETE akkor lesz végrehajtva, ha a célban olyan adatok találhatók, ahol nincs egyezés a forrásban. A MERGE utasításnak számos más lehetséges formája is lehet.

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;

A MERGE utasítás csak a szükséges elemeit használhatja. Tegyük fel például, hogy az adatbázis tartalmaz egy szakaszos számlafrissítéseket tartalmazó táblát, amely a meglévő számlák és az új számlák változatainak kombinációját tartalmazza. Az IF MATCHED és a WHEN NOT MATCHED záradékokkal szükség szerint frissítheti vagy beszúrhatja a számlaadatokat.

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