Flet (SQL)

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 19. januar 2014; checks kræver 17 redigeringer .

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.

Brug af SQL MERGE-sætningen

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

SQL MERGE Ydelsesoptimering

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

Syntaks

- SQL Server og Azure SQL Database [ WITH < common_table_expression > [ , ... n ] ] FLÉT [ TOP ( udtryk ) [ PROCENT ] [ INTO ] < target_table > [ WITH ( < merge_hint > ) ] [ [ AS ] table_alias ] BRUG < table_source > [ [ AS ] table_alias ] < merge_search_condition > [ WHEN MATCHED [ AND < clause_search_condition > ] THEN < merge_matched > ] [ ... n ] [ WHEN NOT MATCHED [ BY TARGET ] [ AND < > ] clause_condition _ < merge_not_matched > ] [ HÅR IKKE MATCHED EFTER KILDE [ AND < clause_search_condition > ] THEN < merge_matched > ] [ ... n ] [ < output_clause > ] [ OPTION ( < query_hint > [ ,... n ] ) ] ; < måltabel > :: = { [ databasenavn . skema_navn . | skema_navn . ] target_table } < merge_hint > :: = { { [ < table_hint_limited > [ ,... n ] ] [ [ , ] INDEX ( index_val [ ,... n ] ) ] } } < merge_search_condition > :: = < search_condition > < merge_matched > :: = { UPDATE SET < set_clause > | SLET } < merge_not_matched > :: = { INSERT [ ( column_list ) ] { VALUES ( values_list ) | STANDARDVÆRDIER } } _ < clause_search_condition > :: = < search_condition >

hvori:

  • hver MERGE-sætning skal slutte med et semikolon. Hvis der ikke er et semikolon i slutningen af ​​MERGE-sætningen, vil en fejl blive kastet;
  • du kan bruge SELECT @@RowCount efter at have skrevet MERGE-sætningen, som returnerer antallet af poster, der er ændret af transaktionen;
  • et af MATCHED [3] -sætningerne er påkrævet for at MERGE-sætningen skal fungere .

Argumenter

MED <common_table_expression>

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.

databasenavn

Navnet på databasen, hvor target_table er placeret .

skemanavn

Navnet på det skema, som target_table tilhører .

target_table

Tabellen 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_alias

Alternativt 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_alias

Alternativt 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.

SLET

Angiver, 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ÆRDIER

Udfylder 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ærkninger

Mindst 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.

Eksempel

FLÉT INTO tabelnavn VED BRUG AF tabel_reference TIL ( betingelse ) NÅR MATCHED OPDATERES SÆT kolonne1 = værdi1 [, kolonne2 = værdi2 ] HÅR IKKE MATCHED , INDSÆT ( kolonne1 [, kolonne2 ]) VÆRDIER ( værdi1 [, værdi2 ]);

Implementeringer

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.

Noter

  1. SQL Server MERGE for at indsætte, opdatere og slette på samme  tid . www.mssqltips.com . Hentet: 22. september 2022.
  2. ↑ 1 2 Aveek Das. Forstå SQL MERGE-   sætningen ? . SQL Shack - artikler om databaserevision, serverydeevne, datagendannelse og mere (27. juli 2020). Hentet: 22. september 2022.
  3. ↑ 1 2 mstehrani. MERGE (Transact-SQL ) - SQL Server   ? . learn.microsoft.com . Hentet: 22. september 2022.

Links

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