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.
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] .
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] .
vart i:
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.
databasnamnNamnet på databasen där target_table finns .
schemanamnNamnet på schemat som target_table tillhör .
måltabellTabellen 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_aliasAlternativt 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_aliasAlternativt 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.
DELETEAnger 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ÄRDENFyller 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ärkningarMinst 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.
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.
Källa: https://web.archive.org/web/20111120170710/http://oracle-wiki.ru/wiki/Merge
SQL | |
---|---|
versioner |
|
Nyckelord |
|
Relaterade artiklar | |
Delar av ISO/IEC SQL |
|
Databas | |
---|---|
Begrepp |
|
Objekt |
|
Nycklar | |
SQL |
|
Komponenter |