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.
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] .
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] .
kde:
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ázeNázev databáze, kde se nachází cílová_tabulka .
schema_nameNázev schématu, do kterého cílová_tabulka patří .
target_tableTabulka 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_tabulkyAlternativní 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_tabulkyAlternativní 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.
VYMAZATUrč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Í HODNOTYNaplní 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ámkyMusí 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.
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.
Zdroj: https://web.archive.org/web/20111120170710/http://oracle-wiki.ru/wiki/Merge
SQL | |
---|---|
Verze |
|
Klíčová slova | |
Související články | |
Části ISO/IEC SQL |
|
Databáze | |
---|---|
Koncepty |
|
Objekty |
|
Klíče | |
SQL | |
Komponenty |