Sloučit (SQL)

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 19. ledna 2014; kontroly vyžadují 17 úprav .

Merge je SQL příkaz , který umožňuje sloučit data z jedné tabulky s daty z jiné tabulky. Při slučování tabulek se podmínka zkontroluje, a pokud je pravdivá, provede se Aktualizace a pokud ne, Vložit . Navíc nelze měnit pole tabulky v sekci Aktualizace, která slouží k propojení dvou tabulek. Data se mění nebo přidávají pouze pro tabulku v klauzuli MERGE INTO, tabulka v klauzuli USING zůstává nezměněna.

Příkaz byl formálně zaveden ve standardu SQL:2003 a rozšířen ve standardu SQL:2008.

Pomocí příkazu SQL MERGE

V typickém řešení datového skladu SQL je často důležité udržovat historii dat ve skladu s odkazem na původní data, která jsou předávána nástroji ETL . Nejběžnějším případem použití je pokus o podporu pomalu se měnících dimenzí (SCD) v datovém skladu. V takových případech musíte do úložiště dat vložit nové záznamy, odstranit nebo označit záznamy z úložiště, které již ve zdroji nejsou, a aktualizovat data v úložišti, která byla aktualizována ve zdroji [1] .

Příkaz SQL MERGE byl představen ve verzi SQL Server 2008, což dalo databázovým programátorům větší flexibilitu při zjednodušení jejich chaotického kódu v příkazech INSERT, UPDATE a DELETE použitím logiky pro implementaci SCD v ETL [2] .

SQL MERGE Performance Optimization

Existuje několik aspektů, které lze použít k optimalizaci výkonu příkazů MERGE. Nyní je možné psát příkazy DML (INSERT, UPDATE a DELETE) spojené do jediného příkazu. Z hlediska zpracování dat je to užitečné, protože to snižuje vstup/výstup na disku pro každý ze tří příkazů zvlášť a umožňuje číst data pouze jednou [3] .

Kromě toho je výkon příkazu MERGE vysoce závislý na indexech použitých ke shodě se zdrojovou i cílovou tabulkou. Kromě indexů je také důležité optimalizovat podmínky spojení. Zároveň by mělo být možné filtrovat zdrojovou tabulku tak, aby operátor vytěžil pouze nezbytné záznamy k provedení nezbytných operací [2] .

Syntaxe

-- SQL Server a Azure SQL Database [ WITH < common_table_expression > [,... n ] ] MERGE [ TOP ( výraz ) [ PERCENT ] ] [ INTO ] < target_table > [ WITH ( < merge_hint > ) ] [ [ AS ] alias_tabulky ] POUŽITÍ < zdroj_tabulky > [ [ JAKO ] alias_tabulky ] ZAPNUTO < podmínka_vyhledání_sloučení > [ PŘI SHODĚ [ AND < podmínka_vyhledávání_klauzule > ] POTOM < sloučení_shody > ] [ ... n ] [ KDYŽ SE NEPŘIDÍ [ PODLE CÍLE ] [ A < podmínka_vyhledání_klauzule > ] _ < merge_not_matched > ] [ WHEN NOT MATCHED BY SOURCE [ AND < clause_search_condition > ] THEN < merge_matched > ] [ ... n ] [ < output_clause > ] [ OPTION ( < query_hint > [ ,... n ] ) ] ; < cílová_tabulka > :: = { [ název_databáze . schema_name . | schema_name . ] target_table } < merge_hint > :: = { { [ < table_hint_limited > [ ,... n ] ] [ [ , ] INDEX ( index_val [ ,... n ] ) ] } } < merge_search_condition > :: = < search_condition > < merge_matched > :: = { UPDATE SET < set_clause > | ODSTRANIT } < merge_not_matched > :: = { INSERT [ ( seznam_sloupců ) ] { VALUES ( seznam_ hodnot ) | VÝCHOZÍ HODNOTY } } < clause_search_condition > :: = < search_condition >

kde:

  • každý příkaz MERGE musí končit středníkem. Pokud na konci příkazu MERGE není středník, dojde k chybě;
  • můžete použít SELECT @@RowCount po napsání příkazu MERGE, který vrátí počet záznamů upravených transakcí;
  • jedna z klauzulí MATCHED [3] je vyžadována, aby příkaz MERGE fungoval .

Argumenty

S <common_table_expression>

Určuje dočasnou pojmenovanou sadu výsledků nebo pohled (známý také jako běžný tabulkový výraz) definovaný v rozsahu příkazu MERGE. Sada výsledků, na kterou odkazuje příkaz MERGE, je odvozena z jednoduchého dotazu.

TOP ( výraz ) [ PROCENTA ]

Určuje počet nebo procento ovlivněných řádků. výraz může být číslo nebo procento počtu řádků. Řádky, na které odkazuje výraz TOP, nejsou v žádném konkrétním pořadí.

název_databáze

Název databáze, kde se nachází cílová_tabulka .

schema_name

Název schématu, do kterého cílová_tabulka patří .

target_table

Tabulka nebo pohled, se kterým jsou řádky dat z tabulky <table_source> porovnány pomocí <clause_search_condition>. Cílová_tabulka je cílem všech operací vložení, aktualizace nebo odstranění specifikovaných klauzulemi WHEN v příkazu MERGE. target_table nemůže být vzdálená tabulka. Pro tabulku target_table by neměla být žádná definovaná pravidla .

Tipy lze zadat jako <merge_hint>.

[ AS ] alias_tabulky

Alternativní název pro odkazy na tabulku pro target_table .

POMOCÍ <zdroj_tabulky>

Určuje zdroj dat, který je namapován na datové řádky v cílové_tabulce na základě <podmínka sloučení_vyhledávání>. Výsledek této shody určuje akce provedené klauzulemi WHEN příkazu MERGE. Argument <zdroj_tabulky> může být vzdálená tabulka nebo pohled, který přistupuje ke vzdáleným tabulkám.

[ AS ] alias_tabulky

Alternativní název pro odkazy na tabulku pro zdroj_tabulky.

ON <merge_search_condition>

Určuje podmínky, za kterých je <zdroj_tabulky> spojen s cílovou_tabulkou za účelem porovnávání. Musíte zadat sloupce cílové tabulky, které se porovnávají s odpovídajícím sloupcem zdrojové tabulky.

PŘI SHODĚ PAK <merge_matched>

Určuje, že všechny řádky *target_table, které odpovídají řádkům vráceným výrazem <table_source> ON <merge_search_condition> a splňují další podmínky vyhledávání, budou aktualizovány nebo odstraněny podle klauzule <merge_matched>.

Příkaz MERGE obsahuje nejvýše dvě klauzule WHEN MATCHED. Jsou-li zadány dvě klauzule, za první klauzulí musí následovat klauzule AND <search_condition>.

KDYŽ SE NESPOJÍ [ PODLE CÍLE ] TAK <merge_not_matched>

Určuje, že se do cílové_tabulky vloží řádek pro každý řádek vrácený výrazem <zdroj_tabulky> ON <podmínka_sloučení_hledání>, který neodpovídá řádku v cílové_tabulce , ale splňuje další podmínku hledání (pokud existuje). Hodnoty, které se mají vložit, jsou určeny pomocí klauzule <merge_not_matched>. Příkaz MERGE může mít pouze jednu klauzuli WHEN NOT MATCHED [ BY TARGET ].

KDYŽ NEPŘIPOJÍ SE ZDROJEM TAK <merge_matched>

Určuje, že všechny řádky *target_table, které neodpovídají řádkům vráceným výrazem <table_source> ON <merge_search_condition> a splňují dodatečné podmínky vyhledávání, budou aktualizovány nebo odstraněny podle klauzule <merge_matched>.

AND <clause_search_condition>

Je zadán jakýkoli platný hledaný výraz.

<table_hint_limited>

Určuje jeden nebo více tipů tabulky, které se mají použít na cílovou tabulku pro každou akci vložení, aktualizace nebo odstranění provedenou příkazem MERGE. Klíčové slovo WITH a závorky jsou povinné.

Klíčová slova NOLOCK a READUNCOMMITTED nejsou povolena.

INDEX ( index_val [ ,...n ] )

Určuje název nebo ID jednoho nebo více indexů v cílové tabulce pro provedení implicitního spojení se zdrojovou tabulkou.

<výstupní_klauzule>

Vrátí jeden řádek pro každý řádek v cílové_tabulce , který má operaci aktualizace, vložení nebo odstranění, v žádném konkrétním pořadí. Parametr $action lze zadat ve výstupní klauzuli. $action je sloupec nvarchar(10), který vrací jednu ze tří hodnot pro každý řádek: INSERT, UPDATE nebo DELETE, podle akce, která byla na daném řádku provedena. Klauzule OUTPUT se doporučuje pro dotazování nebo počítání řádků, které jsou ovlivněny klauzulí MERGE.

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

Určuje, že se tipy optimalizátoru používají k přizpůsobení způsobu, jakým Database Engine zpracovává příkaz.

<merge_matched>

Určuje akci aktualizace nebo odstranění, která se má použít na všechny řádky cílové_tabulky , které neodpovídají řádkům vráceným výrazem <zdroj_tabulky> ON <podmínka_sloučení_hledání> a splňují další podmínky vyhledávání.

UPDATE SET <set_clause>

Určuje seznam názvů sloupců nebo proměnných, které mají být aktualizovány v cílové tabulce, a hodnot pro jejich aktualizaci.

VYMAZAT

Určuje, že budou odstraněny řádky, které odpovídají řádkům v target_table .

<merge_not_matched>

Určuje hodnoty, které se mají vložit do cílové tabulky.

( seznam_sloupců )

Seznam jednoho nebo více sloupců v cílové tabulce, do kterých se vkládají data. Sloupce musí být zadány jako jednosložkový název, jinak příkaz MERGE vrátí chybu. column_list musí být uzavřen v závorkách a jeho prvky musí být odděleny čárkami.

VALUES ( seznam_hodnot )

Seznam oddělený čárkami, který obsahuje konstanty, proměnné nebo výrazy, které vracejí hodnoty, které mají být vloženy do cílové tabulky. Výrazy nemohou obsahovat příkaz EXECUTE.

VÝCHOZÍ HODNOTY

Naplní vložený řádek výchozími hodnotami definovanými pro každý sloupec.

<search_condition>

Nastaví podmínky vyhledávání tak, aby specifikovaly <merge_search_condition> nebo <clause_search_condition>.

Definuje šablonu pro párování grafů.

Poznámky

Musí být zadána alespoň jedna ze tří klauzulí MATCHED, ale lze je zadat v libovolném pořadí. V jedné klauzuli MATCHED nelze proměnnou aktualizovat více než jednou.

Jakékoli odstranění, vložení nebo aktualizace aplikované příkazem MERGE na cílovou tabulku podléhá všem omezením definovaným pro danou tabulku, včetně všech kaskádových omezení integrity dat. Pokud je IGNORE_DUP_KEY zapnuto pro některý z jedinečných indexů cílové tabulky, příkaz MERGE tuto volbu ignoruje.

Chcete-li použít příkaz MERGE, je na konci příkazu vyžadován středník (;). Chyba 10713 nastane, pokud je proveden příkaz MERGE bez konstruktového terminátoru.

Příklad

MERGE INTO table_name USING table_reference ON ( condition ) WHEN MATCHED THEN UPDATE SET sloupec1 = hodnota1 [, sloupec2 = hodnota2 ] KDYŽ NEPŘIPOJÍ , THEN INSERT ( sloupec1 [, sloupec2 ]) HODNOTY ( hodnota1 [, hodnota2 ] );

Implementace

Tento operátor je implementován v následujících systémech pro správu databází Oracle Database, IBM Db2, Teradata, EXASOL, Firebird, CUBRID, H2, HSQLDB, MS SQL, Vectorwise a Apache Derby.

Stejný operátor se používá v databázi Microsoft Azure SQL.

Poznámky

  1. SQL Server MERGE pro vkládání, aktualizaci a mazání  současně . www.mssqltips.com . Staženo: 22. září 2022.
  2. ↑ 1 2 Aveek Das. Rozumíte příkazu SQL   MERGE ? . SQL Shack - články o auditu databází, výkonu serveru, obnově dat a dalších (27. července 2020). Staženo: 22. září 2022.
  3. ↑ 1 2 mstěhrani. MERGE (Transact-SQL ) - SQL Server   ? . learn.microsoft.com . Staženo: 22. září 2022.

Odkazy

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