close

Slå sammen (SQL)

Gå til navigasjon Gå til søk

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  ] 
     < 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 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  
   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

  1. SQL Server MERGE for å sette inn, oppdatere og slette  samtidig . www.mssqltips.com . Hentet: 22. september 2022.
  2. 1 2 Aveek Das. Forstå SQL MERGE-   setningen ? . SQL Shack - artikler om databaserevisjon, serverytelse, datagjenoppretting og mer (27. juli 2020). Hentet: 22. september 2022.
  3. 1 2 mstehrani. MERGE (Transact-SQL ) - SQL Server   ? . learn.microsoft.com . Hentet: 22. september 2022.

Lenker

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