Yhdistä useisiin taulukoihin perustuvat tiedot
Tietokantatoiminnoissa on joskus tarpeen suorittaa SQL Merge -toiminto. Tämän DML-asetuksen avulla voit synkronoida kaksi taulukkoa lisäämällä, päivittämällä tai poistamalla yhden taulukon rivejä toisesta taulukosta löytyvien erojen perusteella. Muokattavaa taulukkoa kutsutaan kohdetaulukoksi. Taulukkoa, jonka avulla määritetään muutettavat rivit, kutsutaan lähdetaulukoksi .
MERGE muokkaa tietoja yhden tai useamman ehdon perusteella:
- Kun lähdetiedoissa on vastaava rivi kohdetaulukossa, se voi päivittää kohdetaulukon tietoja.
- Kun lähdetiedoissa ei ole vastaavuutta tavoitteessa, se voi lisätä tietoja kohdetaulukkoon.
- Kun kohdetiedoissa ei ole vastaavuutta lähteessä, se voi poistaa kohdetiedot.
MERGE-lausekkeen yleinen syntaksi näytetään alla. Täsmäämme kohteen ja lähteen määritetyssä sarakkeessa. Jos kohteen ja lähteen välillä on vastaavuus, määritämme toiminnon kohdetaulukolle. Jos vastaavuutta ei ole, määritämme toiminnon. Toiminto voi olla LISÄÄ-, PÄIVITÄ- tai POISTA-toiminto. Tämä koodi ilmaisee, että päivitys suoritetaan, kun lähteen ja kohteen välillä on vastaavuus. LISÄÄ suoritetaan, kun lähteessä on tietoja, jotka eivät sisällä vastaavia tietoja kohteessa. Lopuksi suoritetaan DELETE-funktio, kun tavoitteessa on tietoja, joiden lähteessä ei ole vastaavuutta. MERGE-lausekkeella on monia muita mahdollisia muotoja.
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;
Voit käyttää vain tarvitsemasi MERGE-lausekkeen elementtejä. Oletetaan esimerkiksi, että tietokanta sisältää vaiheistetun laskun päivitystaulukon, joka sisältää olemassa olevien laskujen ja uusien laskujen tarkistusten yhdistelmän. Voit käyttää WHEN MATCHED- ja WHEN NOT MATCHED -lauseita päivittääksesi tai lisätäksesi laskutietoja tarpeen mukaan.
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);