Sammanfoga (SQL)

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 19 januari 2014; kontroller kräver 17 redigeringar .

Merge är en SQL-sats som låter dig slå samman data från en tabell med data från en annan tabell. Vid sammanslagning av tabeller kontrolleras villkoret, och om det är sant utförs Uppdatering och om inte, Infoga . Dessutom kan du inte ändra fälten i tabellen i avsnittet Uppdatering, som används för att länka två tabeller. Data ändras eller läggs till endast för tabellen i MERGE INTO-satsen, tabellen i USING-satsen förblir oförändrad.

Uttalandet introducerades formellt i SQL:2003-standarden och utökades i SQL:2008-standarden.

Använda SQL MERGE-satsen

I en typisk SQL data warehouse-lösning är det ofta viktigt att upprätthålla en historik över data i lagret med hänvisning till den ursprungliga data som skickas till ETL- verktyget . Det vanligaste användningsfallet är att försöka stödja långsamt föränderliga dimensioner (SCD) i ett datalager. I sådana fall måste du infoga nya poster i datalagret, radera eller markera poster från butiken som inte längre finns i källan och uppdatera data i butiken som uppdaterades vid källan [1] .

SQL MERGE-satsen introducerades i utgåvan av SQL Server 2008, vilket gav databasprogrammerare mer flexibilitet att förenkla sin röriga kod i INSERT-, UPDATE- och DELETE-satser genom att tillämpa logik för att implementera SCD i ETL [2] .

SQL MERGE Performance Optimization

Det finns flera aspekter som kan användas för att optimera prestandan för MERGE-satser. Det är nu möjligt att skriva DML-satser (INSERT, UPDATE och DELETE) kombinerade till en enda sats. Ur databehandlingssynpunkt är detta användbart, eftersom det minskar disk I/O för var och en av de tre satserna separat, och tillåter att data endast kan läsas en gång [3] .

Dessutom är prestandan för MERGE-satsen starkt beroende av de index som används för att matcha både käll- och måltabellerna. Förutom index är det också viktigt att optimera sammanfogningsförhållandena. Samtidigt bör det vara möjligt att filtrera källtabellen så att operatören endast extraherar de nödvändiga posterna för att utföra de nödvändiga operationerna [2] .

Syntax

- SQL Server och Azure SQL Database [ WITH < common_table_expression > [,... n ] ] MERGE [ TOPP ( uttryck ) [ PERCENT ] ] [ INTO ] < target_table > [ WITH ( < merge_hint > ) ] [ [ AS ] table_alias ] ANVÄNDA < table_source > [ [ AS ] table_alias ] < merge_search_condition > [ WHEN MATCHED [ AND < clause_search_condition > ] THEN < merge_matched > ] [ ... n ] [ WHEN NOT MATCHED [ BY MÅL ] [ AND < > ] villkoret_ _ < merge_not_matched > ] [ NÄR INTE MATCHES AV KÄLLA [ OCH < sats_sökvillkor > ] < merge_matched > ] [ ... n ] [ < output_clause > ] [ OPTION ( < query_hint > [ ,... n ] ) ] ; < måltabell > :: = { [ databasnamn . schema_namn . | schema_namn . ] target_table } < merge_hint > :: = { { [ < table_hint_limited > [ ,... n ] ] [ [ , ] INDEX ( index_val [ , ... n ] ) ] } } < merge_search_condition > :: = < sökvillkor > < merge_matched > :: = { UPDATE SET < set_clause > | DELETE } < merge_not_matched > :: = { INFOGA [ ( kolumnlista ) ] { VÄRDEN ( värdelista ) | STANDARDVÄRDEN } } _ < clause_search_condition > :: = < sökvillkor >

vart i:

  • varje MERGE-sats måste sluta med ett semikolon. Om det inte finns något semikolon i slutet av MERGE-satsen, kommer ett fel att visas;
  • du kan använda SELECT @@RowCount efter att ha skrivit MERGE-satsen, som returnerar antalet poster som modifierats av transaktionen;
  • en av MATCHED [3] -satserna krävs för att MERGE-satsen ska fungera .

Argument

MED <common_table_expression>

Anger en temporär namngiven resultatuppsättning eller vy (även känd som ett vanligt tabelluttryck) som definieras inom ramen för en MERGE-sats. Resultatuppsättningen som refereras till av MERGE-satsen härleds från en enkel fråga.

TOP ( uttryck ) [ PROCENT ]

Anger antalet eller procentandelen av berörda rader. uttryck kan vara antingen ett tal eller en procentandel av antalet rader. Raderna som TOP-uttrycket refererar till är inte i någon speciell ordning.

databasnamn

Namnet på databasen där target_table finns .

schemanamn

Namnet på schemat som target_table tillhör .

måltabell

Tabellen eller vyn mot vilken raderna med data från tabellen <table_source> matchas mot av <clause_search_condition>. Måltabellen är målet för alla infognings-, uppdaterings- eller borttagningsoperationer som specificeras av WHEN-satserna i MERGE-satsen . target_table kan inte vara en fjärrtabell. Det bör inte finnas några definierade regler för tabellen target_table .

Tips kan ges som <merge_hint>.

[AS] table_alias

Alternativt namn för tabellreferenser för target_table .

ANVÄNDA <tabellkälla>

Anger en datakälla som är mappad till dataraderna i måltabellen baserat på <merge_search condition>. Resultatet av denna matchning avgör de åtgärder som vidtas av WHEN-satserna i MERGE-satsen. Argumentet <table_source> kan vara en fjärrtabell eller en vy som har åtkomst till fjärrtabeller.

[AS] table_alias

Alternativt namn för tabellreferenser för tabellkälla.

PÅ <merge_search_condition>

Anger villkoren under vilka <tabellkälla> är kopplad till måltabellen för matchning. Du måste ange måltabellkolumnerna som jämförs med motsvarande källtabellkolumn.

NÄR MATCHED DÅ <merge_matched>

Anger att alla *target_table-rader som matchar raderna som returneras av <table_source> ON <merge_search_condition>-uttrycket och som uppfyller ytterligare sökvillkor uppdateras eller tas bort enligt <merge_matched>-satsen.

MERGE-satsen innehåller högst två WHEN MATCHED-satser. Om två satser anges måste den första satsen följas av en AND <search_condition>-sats.

NÄR INTE MATCHAD [ BY MÅL ] DÅ <merge_not_matched>

Anger att en rad infogas i target_table för varje rad som returneras av <table_source> ON <merge_search_condition>-uttrycket som inte matchar en rad i target_table men som uppfyller ett ytterligare sökvillkor (om något). Värdena som ska infogas specificeras med hjälp av <merge_not_matched>-satsen. En MERGE-sats kan bara ha en WHEN NOT MATCHED [BY TARGET]-sats.

NÄR DET INTE MATCHAS EFTER KÄLLA DÅ <merge_matched>

Anger att alla *target_table-rader som inte matchar raderna som returneras av <table_source> ON <merge_search_condition>-uttrycket och som uppfyller de ytterligare sökvillkoren uppdateras eller tas bort enligt <merge_matched>-satsen.

OCH <clause_search_condition>

Alla giltiga söktermer anges.

<table_hint_limited>

Anger en eller flera tabelltips som ska tillämpas på måltabellen för varje infogning, uppdatering eller radering som utförs av MERGE-satsen. Nyckelordet WITH och parenteser krävs.

Nyckelorden NOLOCK och READUNCOMMITTED är inte tillåtna.

INDEX ( index_val [ ,...n ] )

Anger namnet eller ID:t för ett eller flera index på måltabellen för att utföra en implicit koppling på källtabellen.

<output_clause>

Returnerar en rad för varje rad i target_table som har en uppdaterings-, infognings- eller borttagningsoperation, utan särskild ordning. Parametern $action kan anges i output-satsen. $action är en nvarchar(10) kolumn som returnerar ett av tre värden för varje rad: INSERT, UPDATE eller DELETE, enligt åtgärden som utfördes på den raden. OUTPUT-satsen rekommenderas för att fråga eller räkna rader som påverkas av MERGE-satsen.

ALTERNATIV ( <query_hint> [ ,...n ] )

Anger att optimeringstips används för att anpassa hur databasmotorn hanterar uttalandet.

<merge_matched>

Anger uppdaterings- eller raderingsåtgärden som ska tillämpas på alla rader i target_table som inte matchar raderna som returneras av <table_source> ON <merge_search_condition>-uttrycket och som uppfyller ytterligare sökvillkor.

UPPDATERA SET <set_clause>

Anger en lista med kolumn- eller variabelnamn som ska uppdateras i måltabellen och värden för att uppdatera dem.

DELETE

Anger att rader som matchar rader i target_table tas bort.

<merge_not_matched>

Anger värdena som ska infogas i måltabellen.

( kolumnlista )

En lista med en eller flera kolumner i måltabellen i vilka data infogas. Kolumner måste anges som ett enkomponentnamn, annars returnerar MERGE-satsen ett fel. column_list måste omges av parentes och dess element måste separeras med kommatecken.

VÄRDEN ( values_list )

En kommaseparerad lista som innehåller konstanter, variabler eller uttryck som returnerar värden som ska infogas i måltabellen. Uttryck kan inte innehålla en EXECUTE-sats.

STANDARDVÄRDEN

Fyller den infogade raden med standardvärdena definierade för varje kolumn.

<sökvillkor>

Ställer in sökvillkoren för att ange ett <merge_search_condition> eller <clause_search_condition>.

Definierar en grafmatchningsmall.

Anmärkningar

Minst en av de tre MATCHED-satserna måste anges, men de kan anges i valfri ordning. I en enda MATCHED-sats kan en variabel inte uppdateras mer än en gång.

Alla raderingar, infogar eller uppdateringar som tillämpas av en MERGE-sats på en måltabell är föremål för alla begränsningar som definierats för den tabellen, inklusive alla överlappande dataintegritetsbegränsningar. Om IGNORE_DUP_KEY är PÅ för något av måltabellens unika index, ignorerar MERGE-satsen detta alternativ.

För att använda MERGE-satsen krävs ett semikolon (;) som slutet av satsen. Fel 10713 uppstår om en MERGE-sats exekveras utan en konstruktionsterminator.

Exempel

SLÅ IN TILL tabellnamn ANVÄNDA tabellreferens ( villkor ) NÄR MATCHED UPPDATERAS SET kolumn1 = värde1 [, kolumn2 = värde2 ] NÄR INTE MATCHED INFOGA ( kolumn1 [, kolumn2 ] ) VÄRDEN ( värde1 [, värde2 ]);

Implementeringar

Denna operatör är implementerad i följande databashanteringssystem Oracle Database, IBM Db2, Teradata, EXASOL, Firebird, CUBRID, H2, HSQLDB, MS SQL, Vectorwise och Apache Derby.

Samma operatör används i Microsoft Azure SQL-databasen.

Anteckningar

  1. SQL Server MERGE för att infoga, uppdatera och ta bort  samtidigt . www.mssqltips.com . Hämtad: 22 september 2022.
  2. ↑ 1 2 Aveek Das. Förstå SQL MERGE-   satsen ? . SQL Shack - artiklar om databasrevision, serverprestanda, dataåterställning och mer (27 juli 2020). Hämtad: 22 september 2022.
  3. ↑ 1 2 mstehrani. MERGE (Transact-SQL ) - SQL Server   ? . learn.microsoft.com . Hämtad: 22 september 2022.

Länkar

Källa: https://web.archive.org/web/20111120170710/http://oracle-wiki.ru/wiki/Merge