Merge er en SQL-sætning , der giver dig mulighed for at flette data fra en tabel med data fra en anden tabel. Ved fletning af tabeller kontrolleres betingelsen, og hvis den er sand, udføres Update , og hvis ikke, Indsæt . Desuden kan du ikke ændre tabellens felter i opdateringssektionen, som bruges til at forbinde to tabeller. Data ændres eller tilføjes kun for tabellen i MERGE INTO-udtrykket, tabellen i USING-udtrykket forbliver uændret.
Udtalelsen blev formelt introduceret i SQL:2003-standarden og udvidet i SQL:2008-standarden.
I en typisk SQL data warehouse-løsning er det ofte vigtigt at vedligeholde en historik over dataene på lageret med reference til de originale data, der sendes til ETL -værktøjet . Den mest almindelige use case er at forsøge at understøtte langsomt skiftende dimensioner (SCD) i et datavarehus. I sådanne tilfælde skal du indsætte nye poster i datalageret, slette eller markere poster fra lageret, der ikke længere er i kilden, og opdatere dataene i lageret, der blev opdateret ved kilden [1] .
SQL MERGE-sætningen blev introduceret i udgivelsen af SQL Server 2008, som gav databaseprogrammører mere fleksibilitet til at forenkle deres rodede kode i INSERT-, UPDATE- og DELETE-sætninger ved at anvende logik til at implementere SCD i ETL [2] .
Der er flere aspekter, der kan bruges til at optimere ydeevnen af MERGE-udsagn. Det er nu muligt at skrive DML-sætninger (INSERT, UPDATE og DELETE) kombineret til en enkelt sætning. Fra et databehandlingssynspunkt er dette nyttigt, da det reducerer disk I/O for hver af de tre sætninger separat og tillader, at data kun kan læses én gang [3] .
Ydeevnen af MERGE-sætningen er desuden meget afhængig af de indekser, der bruges til at matche både kilde- og måltabellerne. Udover indekser er det også vigtigt at optimere sammenføjningsforholdene. Samtidig bør det være muligt at filtrere kildetabellen, så operatøren kun udtrækker de nødvendige poster for at udføre de nødvendige operationer [2] .
hvori:
Angiver et midlertidigt navngivet resultatsæt eller visning (også kendt som et almindeligt tabeludtryk), der er defineret inden for rammerne af en MERGE-sætning. Resultatsættet, der refereres til af MERGE-sætningen, er afledt af en simpel forespørgsel.
TOP ( udtryk ) [ PROCENT ]Angiver antallet eller procentdelen af berørte rækker. udtryk kan enten være et tal eller en procentdel af antallet af rækker. Rækkerne, der henvises til af TOP-udtrykket, er ikke i nogen bestemt rækkefølge.
databasenavnNavnet på databasen, hvor target_table er placeret .
skemanavnNavnet på det skema, som target_table tilhører .
target_tableTabellen eller visningen, som rækkerne af data fra tabellen <table_source> matches mod af <clause_search_condition>. Måltabellen er målet for enhver indsættelse, opdatering eller sletning, der er specificeret af WHEN-sætningerne i MERGE-sætningen. target_table kan ikke være en ekstern tabel. Der bør ikke være definerede regler for target_table- tabellen .
Hints kan angives som <merge_hint>.
[AS] table_aliasAlternativt navn for tabelreferencer for target_table .
BRUG <table_source>Angiver en datakilde, der er knyttet til datarækkerne i target_table baseret på <merge_search condition>. Resultatet af dette match bestemmer de handlinger, der udføres af WHEN-sætningerne i MERGE-sætningen. Argumentet <table_source> kan være en ekstern tabel eller en visning, der har adgang til fjerntabeller.
[AS] table_aliasAlternativt navn til tabelreferencer for tabelkilde.
TIL <merge_search_condition>Specificerer de betingelser, hvorunder <table_source> er forbundet til target_table for matchning. Du skal angive de måltabelkolonner, der sammenlignes med den tilsvarende kildetabelkolonne.
NÅR MATCHED SÅ <merge_matched>Angiver, at alle *target_table-rækker, der matcher rækkerne returneret af <table_source> ON <merge_search_condition>-udtrykket og opfylder yderligere søgebetingelser, opdateres eller slettes i henhold til <merge_matched>-udtrykket.
MERGE-sætningen indeholder højst to WHEN MATCHED-sætninger. Hvis to sætninger er angivet, skal den første sætning efterfølges af en AND <search_condition>-sætning.
NÅR IKKE MATCHED [AF MÅL] SÅ <merge_not_matched>Angiver, at der indsættes en række i target_table for hver række, der returneres af <table_source> ON <merge_search_condition>-udtrykket, der ikke matcher en række i target_table , men som opfylder en yderligere søgebetingelse (hvis nogen). Værdierne, der skal indsættes, er specificeret ved hjælp af <merge_not_matched>-sætningen. En MERGE-sætning kan kun have én NÅR MATCHED [BY TARGET]-sætning.
NÅR DEN IKKE MATCHES EFTER KILDE, SÅ <merge_matched>Angiver, at alle *target_table-rækker, der ikke matcher rækkerne, der returneres af <table_source> ON <merge_search_condition>-udtrykket og opfylder de yderligere søgebetingelser, opdateres eller slettes i henhold til <merge_matched>-sætningen.
OG <clause_search_condition>Enhver gyldig søgeterm er angivet.
<table_hint_limited>Angiver et eller flere tabeltip, der skal anvendes på måltabellen for hver indsættelses-, opdaterings- eller sletningshandling udført af MERGE-sætningen. Nøgleordet WITH og parenteser er påkrævet.
Nøgleordene NOLOCK og READUNCOMMITTED er ikke tilladt.
INDEX (indeks_værdi [,...n])Angiver navnet eller id'et på et eller flere indekser på måltabellen for at udføre en implicit joinforbindelse på kildetabellen.
<output_clause>Returnerer én række for hver række i target_table , der har en opdaterings-, indsæt- eller sletningsoperation uden nogen bestemt rækkefølge. $action-parameteren kan angives i output-klausulen. $action er en nvarchar(10)-kolonne, der returnerer en af tre værdier for hver række: INSERT, UPDATE eller DELETE, i henhold til den handling, der blev udført på den række. OUTPUT-udtrykket anbefales til at forespørge eller tælle rækker, der er påvirket af MERGE-udtrykket.
OPTION ( <query_hint> [ ,...n ] )Angiver, at optimeringstip bruges til at tilpasse, hvordan databasemotoren håndterer sætningen.
<merge_matched>Specificerer opdaterings- eller sletningshandlingen, der skal gælde for alle rækker i target_table , der ikke matcher rækkerne returneret af <table_source> ON <merge_search_condition> udtrykket og opfylder yderligere søgebetingelser.
OPDATERING SÆT <set_clause>Angiver en liste over kolonne- eller variabelnavne, der skal opdateres i måltabellen, og værdier for at opdatere dem.
SLETAngiver, at rækker, der matcher rækker i target_table , fjernes.
<merge_not_matched>Angiver de værdier, der skal indsættes i måltabellen.
( kolonneliste )En liste over en eller flere kolonner i måltabellen, hvori data er indsat. Kolonner skal angives som et enkeltkomponentnavn, ellers returnerer MERGE-sætningen en fejl. column_list skal være omgivet af parentes, og dens elementer skal adskilles med kommaer.
VALUES ( values_list )En kommasepareret liste, der indeholder konstanter, variabler eller udtryk, der returnerer værdier, der skal indsættes i måltabellen. Udtryk kan ikke indeholde en EXECUTE-sætning.
STANDARDVÆRDIERUdfylder den indsatte række med standardværdierne defineret for hver kolonne.
<søgetilstand>Indstiller søgebetingelserne for at angive en <merge_search_condition> eller <clause_search_condition>.
Definerer en grafmatchende skabelon.
BemærkningerMindst et af de tre MATCHED-sætninger skal angives, men de kan angives i vilkårlig rækkefølge. I et enkelt MATCHED-udtryk kan en variabel ikke opdateres mere end én gang.
Enhver sletning, indsættelse eller opdatering, der anvendes af en MERGE-sætning til en måltabel, er underlagt alle begrænsninger, der er defineret for den tabel, inklusive alle kaskadende dataintegritetsbegrænsninger. Hvis IGNORE_DUP_KEY er TIL for nogen af måltabellens unikke indekser, ignorerer MERGE-sætningen denne mulighed.
For at bruge MERGE-sætningen kræves et semikolon (;) som slutningen af sætningen. Fejl 10713 opstår, hvis en MERGE-sætning udføres uden en konstruktionsterminator.
Denne operatør er implementeret i følgende databasestyringssystemer Oracle Database, IBM Db2, Teradata, EXASOL, Firebird, CUBRID, H2, HSQLDB, MS SQL, Vectorwise og Apache Derby.
Den samme operatør bruges i Microsoft Azure SQL-databasen.
Kilde: https://web.archive.org/web/20111120170710/http://oracle-wiki.ru/wiki/Merge
SQL | |
---|---|
Versioner |
|
Nøgleord | |
Relaterede artikler | |
Dele af ISO/IEC SQL |
|
Database | |
---|---|
Begreber |
|
Objekter | |
Nøgler | |
SQL | |
Komponenter |