SQL Server MERGE (Română)
Rezumat: în acest tutorial, veți afla cum să utilizați SQL Server MERGE
pentru a actualiza datele într-un tabel pe baza valorilor potrivite dintr-un alt tabel.
Introducere Instrucțiune SQL Server MERGE
Să presupunem că aveți două tabele numite tabele sursă și țintă și trebuie să actualizați tabelul țintă pe baza valorilor potrivite din tabelul sursă. Există trei cazuri:
- Tabelul sursă are câteva rânduri care nu există în tabelul țintă. În acest caz, trebuie să inserați rânduri care se află în tabelul sursă în tabelul țintă.
- Tabelul țintă are câteva rânduri care nu există în tabelul sursă. În acest caz, trebuie să ștergeți rânduri din tabelul țintă.
- Tabelul sursă are câteva rânduri cu aceleași chei ca rândurile din tabelul țintă. Cu toate acestea, aceste rânduri au valori diferite în coloanele non-cheie. În acest caz, trebuie să actualizați rândurile din tabelul țintă cu valorile provenite din tabelul sursă.
Următoarea imagine ilustrează tabelele sursă și țintă cu acțiunile corespunzătoare: inserare, actualizați și ștergeți:
Dacă folosiți INSERT
, UPDATE
și DELETE
individual, trebuie să construiți trei separate instrucțiuni pentru a actualiza datele la tabelul țintă cu rândurile potrivite din tabelul sursă.
Cu toate acestea, SQL Server oferă instrucțiunea MERGE
care vă permite să efectuați trei acțiuni în același timp. Următorul arată sintaxa declarației MERGE
:
Code language: SQL (Structured Query Language) (sql)
Mai întâi, specificați tabelul țintă și sursa tabel din clauza MERGE
.
În al doilea rând, merge_condition
determină modul în care se potrivesc rândurile din tabelul sursă rândurile din tabelul țintă. Este similară condiției de asociere din clauza de asociere. De obicei, utilizați coloanele cheii fie cheie primară, fie cheie unică pentru potrivire.
În al treilea rând, merge_condition
are ca rezultat trei stări: MATCHED
, NOT MATCHED
și NOT MATCHED BY SOURCE
.
-
MATCHED
: acestea sunt rândurile care corespund condiției de îmbinare. În diagramă, acestea sunt afișate ca albastru. Pentru rândurile potrivite, trebuie să actualizați coloanele rândurilor din tabelul țintă cu valori din tabelul sursă. -
NOT MATCHED
: acestea sunt rândurile din sursă tabel care nu are niciun rând potrivit în tabelul țintă. În diagramă, acestea sunt prezentate ca portocalii. În acest caz, trebuie să adăugați rândurile din tabelul sursă la tabelul țintă. Rețineți căNOT MATCHED
este, de asemenea, cunoscut sub numele deNOT MATCHED BY TARGET
. -
NOT MATCHED BY SOURCE
: acestea sunt rândurile din tabelul țintă care nu se potrivește cu niciun rând din tabelul sursă. Acestea sunt prezentate ca verzi în diagramă. Dacă doriți să sincronizați tabelul țintă cu datele din tabelul sursă, va trebui să utilizați această condiție de potrivire pentru a șterge rândurile din tabelul țintă.
Exemplu de instrucțiune SQL Server MERGE
Să presupunem că avem două tabele sales.category
și sales.category_staging
care stochează vânzările pe categorii de produse.
Pentru a actualiza datele la sales.category
(tabel țintă) cu valorile din sales.category_staging
(tabel sursă), utilizați următorul MERGE
declarație:
În acest exemplu, am folosit valorile din coloanele category_id
din ambele tabele ca condiție de îmbinare.
- Mai întâi, rândurile cu id 1, 3, 4 din tabelul
sales.category_staging
se potrivește cu rândurile din tabelul țintă, prin urmare, instrucțiuneaMERGE
actualizează valorile în coloana cu numele și suma categoriei în tabelulsales.category
. - În al doilea rând, rândurile cu id 5 și 6 din tabelul
sales.category_staging
nu există în tabelulsales.category
, deci instrucțiuneaMERGE
introduce aceste rânduri în tabelul țintă. - În al treilea rând, rândul cu id 2 din tabelul
sales.category
nu există în tabelulsales.sales_staging
, prin urmare,MERGE
șterge acest rând.
Ca rezultat al fuziunii, datele din tabelul sales.category
sunt complet sincronizate cu datele din sales.category_staging
tabel.
În acest tutorial, ați aflat cum să utilizați instrucțiunea SQL Server MERGE
pentru a face modificări într-un tabel bazat pe potrivirea valorilor dintr-un alt tabel.