Slå sammen (SQL)
Merge er en SQL-setning som lar deg slå sammen data fra en tabell med data fra en annen tabell. Ved sammenslåing av tabeller kontrolleres betingelsen, og hvis den er sann, utføres Oppdatering , og hvis ikke, Sett inn . Dessuten kan du ikke endre feltene i tabellen i Oppdater-delen, som brukes til å koble sammen to tabeller. Data endres eller legges til bare for tabellen i MERGE INTO-leddet, tabellen i USING-leddet forblir uendret.
Uttalelsen ble formelt introdusert i SQL:2003-standarden og utvidet i SQL:2008-standarden.
Bruke SQL MERGE-setningen
I en typisk SQL datavarehusløsning er det ofte viktig å opprettholde en historikk over dataene på lageret med referanse til de originale dataene som sendes til ETL -verktøyet . Den vanligste brukssaken er å prøve å støtte langsomt skiftende dimensjoner (SCD) i et datavarehus. I slike tilfeller må du sette inn nye poster i datalageret, slette eller merke poster fra lageret som ikke lenger er i kilden, og oppdatere dataene i lageret som ble oppdatert ved kilden [1] .
SQL MERGE-setningen ble introdusert i utgivelsen av SQL Server 2008, som ga databaseprogrammerere mer fleksibilitet til å forenkle deres rotete kode i INSERT-, UPDATE- og DELETE-setninger ved å bruke logikk for å implementere SCD i ETL [2] .
SQL MERGE Ytelsesoptimalisering
Det er flere aspekter som kan brukes til å optimalisere ytelsen til MERGE-utsagn. Det er nå mulig å skrive DML-setninger (INSERT, UPDATE og DELETE) kombinert til en enkelt setning. Fra et databehandlingssynspunkt er dette nyttig, siden det reduserer disk I/O for hver av de tre setningene separat, og gjør at data kun kan leses én gang [3] .
I tillegg er ytelsen til MERGE-setningen svært avhengig av indeksene som brukes for å matche både kilde- og måltabellene. Bortsett fra indekser er det også viktig å optimalisere sammenføyningsforholdene. Samtidig skal det være mulig å filtrere kildetabellen slik at operatøren kun trekker ut de nødvendige postene for å utføre de nødvendige operasjonene [2] .
Syntaks
-- SQL Server og Azure SQL Database
[ WITH < common_table_expression > [,... n ] ]
MERGE
[ TOPP ( uttrykk ) [ PROSENT ] ]
[ INTO ] < target_table > [ WITH ( < merge_hint > ) ] [ [ AS ] table_alias ]
BRUKER < table_source > [ [ AS ] table_alias ]
PÅ < merge_search_condition >
[ WHEN MATCHED [ AND < clause_search_condition > ]
THEN < merge_matched > ] [ ... n ]
[ WHEN NOT MATCHED [ BY TARGET ] [ AND < > ] _condition _ < merge_not_matched > ] [ NÅR IKKE MATCHES AV KILDE [ AND < clause_search_condition > ] THEN < merge_matched > ] [ ... n ] [ < output_clause > ] [ OPTION ( < query_hint > [ ,... n ] ) ] ;
< måltabell > :: =
{
[ databasenavn . skjemanavn . | skjemanavn . ]
target_table
}
< merge_hint > :: =
{
{ [ < table_hint_limited > [ ,... n ] ]
[ [ , ] INDEX ( index_val [ , ... n ] ) ] }
}
< merge_search_condition > :: =
< search_condition >
< merge_matched > :: =
{ UPDATE SET < set_clause > | SLETT }
< merge_not_matched > :: =
{
INSERT [ ( column_list ) ]
{ VALUES ( values_list )
| STANDARDVERDIER } } _
< clause_search_condition > :: =
< search_condition >
hvori:
- hver MERGE-setning må slutte med semikolon. Hvis det ikke er noe semikolon på slutten av MERGE-setningen, vil en feil bli kastet;
- du kan bruke SELECT @@RowCount etter å ha skrevet MERGE-setningen, som vil returnere antall poster som er endret av transaksjonen;
- en av MATCHED [3] -setningene kreves for at MERGE-setningen skal fungere .
Argumenter
MED <common_table_expression>
Spesifiserer et midlertidig navngitt resultatsett eller visning (også kjent som et vanlig tabelluttrykk) definert i omfanget av en MERGE-setning. Resultatsettet referert til av MERGE-setningen er avledet fra en enkel spørring.
TOPP ( uttrykk ) [ PROSENT ]
Angir antall eller prosentandel av berørte rader. uttrykk kan enten være et tall eller en prosentandel av antall rader. Radene det refereres til av TOP-uttrykket er ikke i noen spesiell rekkefølge.
databasenavn
Navnet på databasen der måltabellen er plassert .
skjemanavn
Navnet på skjemaet som måltabellen tilhører .
måltabell
Tabellen eller visningen som radene med data fra tabellen <table_source> matches mot av <clause_search_condition>. Måltabellen er målet for alle innsettings-, oppdaterings- eller slettingsoperasjoner spesifisert av WHEN-klausulene i MERGE-setningen. target_table kan ikke være en ekstern tabell. Det skal ikke være definerte regler for target_table - tabellen .
Hint kan spesifiseres som <merge_hint>.
[AS] table_alias
Alternativt navn for tabellreferanser for target_table .
BRUKER <tabellkilde>
Angir en datakilde som er tilordnet dataradene i måltabellen basert på <merge_search condition>. Resultatet av denne matchen bestemmer handlingene som utføres av WHEN-klausulene i MERGE-setningen. Argumentet <table_source> kan være en ekstern tabell eller en visning som har tilgang til eksterne tabeller.
[AS] table_alias
Alternativt navn for tabellreferanser for tabellkilde.
PÅ <merge_search_condition>
Spesifiserer betingelsene under hvilke <tabellkilde> er koblet til måltabellen for samsvar. Du må spesifisere måltabellkolonnene som sammenlignes med den tilsvarende kildetabellkolonnen.
NÅR MATCHED SÅ <merge_matched>
Spesifiserer at alle *target_table-rader som samsvarer med radene som returneres av <table_source> ON <merge_search_condition>-uttrykket og tilfredsstiller ytterligere søkebetingelser, oppdateres eller slettes i henhold til <merge_matched>-leddet.
MERGE-setningen inkluderer maksimalt to NÅR MATCHED-klausuler. Hvis to ledd er spesifisert, må det første leddet følges av et AND <search_condition>-ledd.
NÅR IKKE MATCHED [ BY MÅL ] SÅ <merge_not_matched>
Spesifiserer at en rad settes inn i target_table for hver rad som returneres av <table_source> ON <merge_search_condition>-uttrykket som ikke samsvarer med en rad i target_table , men som tilfredsstiller en ekstra søkebetingelse (hvis noen). Verdiene som skal settes inn er spesifisert ved å bruke <merge_not_matched>-leddet. En MERGE-setning kan bare ha én NÅR IKKE MATCHED [BY TARGET]-klausul.
NÅR DET IKKE SAMMENSES AV KILDE, SÅ <merge_matched>
Spesifiserer at alle *target_table-rader som ikke samsvarer med radene som returneres av <table_source> ON <merge_search_condition>-uttrykket og tilfredsstiller de ekstra søkebetingelsene, oppdateres eller slettes i henhold til <merge_matched>-leddet.
OG <clause_search_condition>
Enhver gyldig søketerm er spesifisert.
<table_hint_limited>
Angir ett eller flere tabellhint som skal brukes på måltabellen for hver innsetting, oppdatering eller sletting utført av MERGE-setningen. Nøkkelordet WITH og parenteser er obligatoriske.
Nøkkelordene NOLOCK og READUNCOMMITTED er ikke tillatt.
INDEX (indeks_verdi [,...n])
Angir navnet eller ID-en til én eller flere indekser på måltabellen for å utføre en implisitt sammenføyning på kildetabellen.
<output_clause>
Returnerer én rad for hver rad i target_table som har en oppdaterings-, innsettings- eller slettingsoperasjon, uten spesiell rekkefølge. $action-parameteren kan spesifiseres i output-leddet. $action er en nvarchar(10)-kolonne som returnerer en av tre verdier for hver rad: INSERT, UPDATE eller DELETE, i henhold til handlingen som ble utført på den raden. OUTPUT-leddet anbefales for spørring eller telling av rader som påvirkes av MERGE-leddet.
OPTION ( <query_hint> [ ,...n ] )
Angir at optimeringshint brukes for å tilpasse hvordan databasemotoren håndterer setningen.
<merge_matched>
Spesifiserer oppdaterings- eller slettingshandlingen som skal gjelde for alle rader i måltabellen som ikke samsvarer med radene som returneres av <tabellkilde> ON <merge_search_condition>-uttrykket og som tilfredsstiller ytterligere søkebetingelser.
OPPDATERING SET <set_clause>
Angir en liste over kolonne- eller variabelnavn som skal oppdateres i måltabellen og verdier for å oppdatere dem.
SLETT
Angir at rader som samsvarer med rader i target_table fjernes.
<merge_not_matched>
Spesifiserer verdiene som skal settes inn i måltabellen.
( kolonneliste )
En liste over én eller flere kolonner i måltabellen som data settes inn i. Kolonner må spesifiseres som et enkeltkomponentnavn, ellers returnerer MERGE-setningen en feil. column_list må omsluttes i parentes, og elementene må være atskilt med komma.
VERDIER ( verdiliste )
En kommadelt liste som inneholder konstanter, variabler eller uttrykk som returnerer verdier som skal settes inn i måltabellen. Uttrykk kan ikke inneholde en EXECUTE-setning.
STANDARDVERDIER
Fyller den innsatte raden med standardverdiene definert for hver kolonne.
<søketilstand>
Angir søkebetingelsene for å spesifisere en <merge_search_condition> eller <clause_search_condition>.
Definerer en grafsamsvarsmal.
Merknader
Minst ett av de tre MATCHED-klausulene må spesifiseres, men de kan spesifiseres i hvilken som helst rekkefølge. I en enkelt MATCHED-klausul kan ikke en variabel oppdateres mer enn én gang.
Enhver sletting, innsetting eller oppdatering brukt av en MERGE-setning til en måltabell er underlagt alle begrensninger som er definert for den tabellen, inkludert alle begrensninger for gjennomgripende dataintegritet. Hvis IGNORE_DUP_KEY er PÅ for noen av måltabellens unike indekser, ignorerer MERGE-setningen dette alternativet.
For å bruke MERGE-setningen kreves et semikolon (;) som slutten av setningen. Feil 10713 oppstår hvis en MERGE-setning utføres uten en konstruksjonsterminator.
Eksempel
MERGE INTO table_name USING table_reference ON ( condition )
NÅR MATCHED SÅ
OPPDATER SET column1 = value1 [, column2 = value2 … ]
WHEN NOT MATCHED THEN
INSERT ( column1 [, column2 … ]) VALUES ( verdi1 [, verdi2 ... ]);
Implementeringer
Denne operatøren er implementert i følgende databasebehandlingssystemer Oracle Database, IBM Db2, Teradata, EXASOL, Firebird, CUBRID, H2, HSQLDB, MS SQL, Vectorwise og Apache Derby.
Den samme operatøren brukes i Microsoft Azure SQL-databasen.
Merknader
- ↑ SQL Server MERGE for å sette inn, oppdatere og slette samtidig . www.mssqltips.com . Hentet: 22. september 2022.
- ↑ 1 2 Aveek Das. Forstå SQL MERGE- setningen ? . SQL Shack - artikler om databaserevisjon, serverytelse, datagjenoppretting og mer (27. juli 2020). Hentet: 22. september 2022.
- ↑ 1 2 mstehrani. MERGE (Transact-SQL ) - SQL Server ? . learn.microsoft.com . Hentet: 22. september 2022.
Lenker
- Oracle Documentation 12c
- Dokunevner SQL Server 2008
- https://en.wikipedia.org/wiki/Merge_(SQL)
Kilde: https://web.archive.org/web/20111120170710/http://oracle-wiki.ru/wiki/Merge