Îmbinare (SQL)

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 19 ianuarie 2014; verificările necesită 17 modificări .

Merge este o instrucțiune SQL care vă permite să îmbinați datele dintr-un tabel cu datele dintr-un alt tabel. La îmbinarea tabelelor, condiția este verificată, iar dacă este adevărată, se efectuează Actualizare , iar dacă nu, Insert . Mai mult, nu puteți modifica câmpurile tabelului din secțiunea Actualizare, care sunt folosite pentru a lega două tabele. Datele sunt modificate sau adăugate numai pentru tabelul din clauza MERGE INTO, tabelul din clauza USING rămâne neschimbat.

Declarația a fost introdusă oficial în standardul SQL:2003 și extinsă în standardul SQL:2008.

Folosind instrucțiunea SQL MERGE

Într-o soluție tipică de depozit de date SQL , este adesea important să păstrați un istoric al datelor din depozit cu referire la datele originale care sunt transmise instrumentului ETL . Cel mai obișnuit caz de utilizare este încercarea de a accepta dimensiunile care se schimbă lentă (SCD) într-un depozit de date. În astfel de cazuri, trebuie să introduceți înregistrări noi în depozitul de date, să ștergeți sau să marcați înregistrările din magazin care nu mai sunt în sursă și să actualizați datele din magazin care au fost actualizate la sursă [1] .

Instrucțiunea SQL MERGE a fost introdusă în versiunea SQL Server 2008, care a oferit programatorilor baze de date mai multă flexibilitate pentru a-și simplifica codul dezordonat în instrucțiunile INSERT, UPDATE și DELETE prin aplicarea logicii pentru a implementa SCD în ETL [2] .

Optimizarea performanței SQL MERGE

Există mai multe aspecte care pot fi folosite pentru a optimiza performanța declarațiilor MERGE. Acum este posibil să scrieți instrucțiuni DML (INSERT, UPDATE și DELETE) combinate într-o singură instrucțiune. Din punct de vedere al procesării datelor, acest lucru este util, deoarece reduce I/O pe disc pentru fiecare dintre cele trei instrucțiuni separat și permite ca datele să fie citite o singură dată [3] .

În plus, performanța instrucțiunii MERGE depinde în mare măsură de indecșii utilizați pentru a se potrivi atât cu tabelele sursă, cât și cu tabelele țintă. În afară de indici, este de asemenea important să optimizați condițiile de conectare. În același timp, ar trebui să fie posibilă filtrarea tabelului sursă astfel încât operatorul să extragă doar înregistrările necesare pentru a efectua operațiunile necesare [2] .

Sintaxă

-- SQL Server și Azure SQL Database [ WITH < common_table_expression > [,... n ] ] MERGE [ TOP ( expresie ) [ PERCENT ] ] [ INTO ] < target_table > [ WITH ( < merge_hint > ) ] [ [ AS ] table_alias ] UTILIZAREA < sursă_tabelă > [ [ AS ] alias_ tabel ] ON < merge_search_condition > [ WHEN MATCHED [ AND < clause_search_condition > ] THEN < merge_matched > ] [ ... n ] [ WHEN NOT MATCHED [ BY TARGET ] [ AND < clause_search_condition > ] THEN < merge_not_matched > ] [ WHEN NOT MATCHED BY SOURSE [ AND < clause_search_condition > ] THEN < merge_matched > ] [ ... n ] [ < output_clause > ] [ OPTION ( < query_hint > [ ,... n ] ] ] ; < target_table > :: = { [ database_name . schema_name . | schema_name . ] target_table } < merge_hint > :: = { { [ < table_hint_limited > [ ,... n ] ] [ [ , ] INDEX ( index_val [ ,... n ] ) ] } } < merge_search_condition > :: = < search_condition > < merge_matched > :: = { UPDATE SET < set_clause > | ȘTERGE } < merge_not_matched > :: = { INSERT [ ( listă_coloană ) ] { VALORI ( listă_valori ) | VALORI IMPLICITE } } < clause_search_condition > :: = < search_condition >

în care:

  • fiecare instrucțiune MERGE trebuie să se încheie cu punct și virgulă. Dacă nu există punct și virgulă la sfârșitul instrucțiunii MERGE, va fi aruncată o eroare;
  • puteți folosi SELECT @@RowCount după ce ați scris instrucțiunea MERGE, care va returna numărul de înregistrări modificate de tranzacție;
  • una dintre clauzele MATCHED [3] este necesară pentru ca instrucțiunea MERGE să funcționeze .

Argumente

CU <common_table_expression>

Specifică un set de rezultate sau o vizualizare temporară denumită (cunoscută și ca expresie de tabel comună) definită în domeniul de aplicare al unei instrucțiuni MERGE. Setul de rezultate la care face referire instrucțiunea MERGE este derivat dintr-o interogare simplă.

TOP ( expresie ) [PERCENT]

Specifică numărul sau procentul de rânduri afectate. expresia poate fi fie un număr, fie un procent din numărul de rânduri. Rândurile la care face referire expresia TOP nu sunt într-o anumită ordine.

numele_bază de date

Numele bazei de date în care se află target_table .

schema_name

Numele schemei căreia îi aparține tabelul_țintă .

tabel_țintă

Tabelul sau vizualizarea cu care se potrivesc rândurile de date din tabelul <table_source> de către <clause_search_condition>. target_table este ținta oricăror operațiuni de inserare, actualizare sau ștergere specificate de clauzele WHEN din instrucțiunea MERGE. target_table nu poate fi un tabel la distanță. Nu ar trebui să existe reguli definite pentru tabelul target_table .

Sugestiile pot fi specificate ca <merge_hint>.

[ AS ] table_alias

Nume alternativ pentru referințele de tabel pentru target_table .

UTILIZAREA <sursa_tabelului>

Specifică o sursă de date care este mapată la rândurile de date din tabelul_țintă pe baza <condiție de căutare_merge>. Rezultatul acestei potriviri determină acțiunile întreprinse de clauzele WHEN ale instrucțiunii MERGE. Argumentul <table_source> poate fi un tabel la distanță sau o vizualizare care accesează tabele la distanță.

[ AS ] table_alias

Nume alternativ pentru referințele de tabel pentru table_source.

ON <merge_search_condition>

Specifică condițiile în care <table_source> este conectat la target_table pentru potrivire. Trebuie să specificați coloanele tabelului țintă care sunt comparate cu coloana corespunzătoare a tabelului sursă.

WHEN MATCHED THEN <merge_matched>

Specifică faptul că toate rândurile *target_table care se potrivesc cu rândurile returnate de expresia <table_source> ON <merge_search_condition> și care satisfac condiții suplimentare de căutare sunt actualizate sau șterse conform clauzei <merge_matched>.

Instrucțiunea MERGE include cel mult două clauze WHEN MATCHED. Dacă sunt specificate două clauze, prima clauză trebuie să fie urmată de o clauză AND <condiție_căutare>.

CÂND NU ESTE POTRIVIT [DUPĂ ȚINTĂ] APOI <merge_not_matched>

Specifică faptul că în tabelul_țintă este inserat un rând pentru fiecare rând returnat de expresia <sursă_tabel> ON <condiție_căutare> care nu se potrivește cu un rând din tabelul_țintă , dar care satisface o condiție de căutare suplimentară (dacă există). Valorile de inserat sunt specificate folosind clauza <merge_not_matched>. O instrucțiune MERGE poate avea o singură clauză WHEN NOT MATCHED [ BY TARGET ].

CÂND NU ESTE POTRIVIT DE SURSA APOI <merge_matched>

Specifică faptul că toate rândurile *target_table care nu se potrivesc cu rândurile returnate de expresia <table_source> ON <merge_search_condition> și satisfac condițiile suplimentare de căutare sunt actualizate sau șterse conform clauzei <merge_matched>.

ȘI <condiție_căutare_clauză>

Este specificat orice termen de căutare valid.

<table_hint_limited>

Specifică unul sau mai multe indicii de tabel care urmează să fie aplicate tabelului țintă pentru fiecare acțiune de inserare, actualizare sau ștergere efectuată de instrucțiunea MERGE. Cuvântul cheie WITH și parantezele sunt necesare.

Cuvintele cheie NOLOCK și READUNCOMMITTED nu sunt permise.

INDEX ( index_val [ ,...n ] )

Specifică numele sau ID-ul unuia sau mai multor indecși de pe tabelul țintă pentru a efectua o îmbinare implicită pe tabelul sursă.

<clauză_ieșire>

Returnează un rând pentru fiecare rând din target_table care are o operație de actualizare, inserare sau ștergere, fără o anumită ordine. Parametrul $action poate fi specificat în clauza de ieșire. $action este o coloană nvarchar(10) care returnează una dintre cele trei valori pentru fiecare rând: INSERT, UPDATE sau DELETE, în funcție de acțiunea care a fost efectuată pe acel rând. Clauza OUTPUT este recomandată pentru interogarea sau numărarea rândurilor care sunt afectate de clauza MERGE.

OPȚIUNE ( <query_hint> [ ,...n ] )

Specifică faptul că sugestiile de optimizare sunt folosite pentru a personaliza modul în care Motorul de baze de date gestionează declarația.

<merge_matched>

Specifică acțiunea de actualizare sau ștergere care se aplică tuturor rândurilor din tabelul_țintă care nu se potrivesc cu rândurile returnate de expresia <sursă_tabel> ON <condiție_căutare> și satisfac condiții suplimentare de căutare.

UPDATE SET <set_clause>

Specifică o listă de nume de coloane sau variabile care trebuie actualizate în tabelul țintă și valori pentru a le actualiza.

ȘTERGE

Specifică faptul că rândurile care se potrivesc cu rândurile din target_table sunt eliminate.

<merge_not_matched>

Specifică valorile de inserat în tabelul țintă.

( lista_coloanelor )

O listă cu una sau mai multe coloane din tabelul țintă în care sunt inserate datele. Coloanele trebuie specificate ca nume cu o singură componentă, altfel instrucțiunea MERGE returnează o eroare. column_list trebuie să fie cuprinsă în paranteze, iar elementele sale trebuie separate prin virgulă.

VALUES ( listă_valori )

O listă separată prin virgulă care conține constante, variabile sau expresii care returnează valori pentru a fi inserate în tabelul țintă. Expresiile nu pot conține o instrucțiune EXECUTE.

VALORI IMPLICITE

Completează rândul inserat cu valorile implicite definite pentru fiecare coloană.

<condiție_căutare>

Setează condițiile de căutare pentru a specifica o <merge_search_condition> sau <clause_search_condition>.

Definește un șablon de potrivire grafică.

Observații

Trebuie specificată cel puțin una dintre cele trei clauze MATCHED, dar pot fi specificate în orice ordine. Într-o singură clauză MATCHED, o variabilă nu poate fi actualizată de mai multe ori.

Orice ștergere, inserare sau actualizare aplicată de o instrucțiune MERGE unui tabel țintă este supusă tuturor restricțiilor definite pentru acel tabel, inclusiv orice constrângeri de integritate a datelor în cascadă. Dacă IGNORE_DUP_KEY este ON pentru oricare dintre indecșii unici ai tabelului țintă, atunci instrucțiunea MERGE ignoră această opțiune.

Pentru a utiliza instrucțiunea MERGE, este necesară un punct și virgulă (;) ca sfârșit al instrucțiunii. Eroarea 10713 apare dacă o instrucțiune MERGE este executată fără un terminator de construcție.

Exemplu

MERGE INTO table_name USING table_reference ON ( condiție ) WHEN MATCHED THEN UPDATE SET column1 = value1 [, column2 = value2 ] WHEN NOT MACHED THEN INSERT ( coloana1 [, coloana2 ]) VALUES ( value1 [, value2 ]);

Implementări

Acest operator este implementat în următoarele sisteme de gestionare a bazelor de date Oracle Database, IBM Db2, Teradata, EXASOL, Firebird, CUBRID, H2, HSQLDB, MS SQL, Vectorwise și Apache Derby.

Același operator este utilizat în baza de date Microsoft Azure SQL.

Note

  1. SQL Server MERGE pentru a insera, actualiza și șterge în același  timp . www.mssqltips.com . Preluat: 22 septembrie 2022.
  2. ↑ 1 2 Aveek Das. Înțelegerea instrucțiunii SQL   MERGE ? . SQL Shack - articole despre auditarea bazelor de date, performanța serverului, recuperarea datelor și multe altele (27 iulie 2020). Preluat: 22 septembrie 2022.
  3. ↑ 1 2 mstehrani. MERGE (Transact-SQL ) - SQL Server   ? . learn.microsoft.com . Preluat: 22 septembrie 2022.

Link -uri

Sursa: https://web.archive.org/web/20111120170710/http://oracle-wiki.ru/wiki/Merge