Egyesítés (SQL)

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt hozzászólók, és jelentősen eltérhet a 2014. január 19-én felülvizsgált verziótól ; az ellenőrzések 17 szerkesztést igényelnek .

A Merge egy SQL utasítás , amely lehetővé teszi egy tábla adatainak egyesítését egy másik tábla adataival. Táblázatok egyesítésekor a feltétel ellenőrzésre kerül, és ha igaz, akkor Frissítés történik , ha nem, akkor Insert . Ezenkívül nem módosíthatja a Frissítés szakaszban lévő táblázat mezőit, amelyek két tábla összekapcsolására szolgálnak. Az adatok csak a MERGE INTO záradékban lévő táblázathoz módosulnak vagy hozzáadódnak, a USING záradékban lévő táblázat változatlan marad.

Az utasítást formálisan az SQL:2003 szabványban vezették be, és az SQL:2008 szabványban bővítették ki.

Az SQL MERGE utasítás használata

Egy tipikus SQL adattárház-megoldásban gyakran fontos a raktárban lévő adatok előzményeinek megőrzése az ETL -eszköznek átadott eredeti adatokra hivatkozva . A leggyakoribb felhasználási eset a lassan változó dimenziók (SCD) támogatása egy adattárházban. Ilyen esetekben új rekordokat kell beszúrni az adattárba, törölni vagy megjelölni a tárolóból azokat a rekordokat, amelyek már nem szerepelnek a forrásban, és frissíteni kell a tárolóban a forrásnál frissített adatokat [1] .

Az SQL MERGE utasítást az SQL Server 2008 kiadásában vezették be, amely nagyobb rugalmasságot adott az adatbázis-programozóknak az INSERT, UPDATE és DELETE utasításokban szereplő rendetlen kódjuk egyszerűsítésére azáltal, hogy logikát alkalmaz az SCD ETL-ben való megvalósítására [2] .

SQL MERGE teljesítményoptimalizálás

Számos szempont használható a MERGE utasítások teljesítményének optimalizálására. Mostantól lehetséges DML utasítások (INSERT, UPDATE és DELETE) írása egyetlen utasításba kombinálva. Adatfeldolgozási szempontból ez hasznos, mivel mindhárom utasítás esetében külön-külön lecsökkenti a lemez I/O-ját, és az adatok csak egyszer olvashatók be [3] .

Ezenkívül a MERGE utasítás teljesítménye nagymértékben függ a forrás- és a céltáblázathoz illeszkedő indexektől. Az indexeken kívül fontos a csatlakozási feltételek optimalizálása is. Ugyanakkor lehetővé kell tenni a forrástábla szűrését úgy, hogy az operátor csak a szükséges rekordokat vonja ki a szükséges műveletek elvégzéséhez [2] .

Szintaxis

-- SQL Server és Azure SQL Database [ WITH < közös_táblakifejezés > [,... n ] ] MERGE [ TOP ( kifejezés ) [ PERCENT ] ] [ INTO ] < cél_tábla > [ WITH ( < merge_hint > ) ] [ [ AS ] table_alias ] USING < table_source > [ [ AS ] table_alias ] ON < merge_search_condition > [ WHEN MATCHED [ AND < clause_search_condition > ] THEN < merge_matched > ] [ ... n ] [ WHEN NOT MATCHED [ BY TARGET > ] [ AND ] N feltétel_keresés _ < merge_not_matched > ] [ AMIKOR NEM egyezik FORRÁSSAL [ ÉS < clause_search_condition > ] THEN < merge_matched > ] [ ... n ] [ < output_clause > ] [ OPTION ( < query_hint > [ , ... n ] ) ] ; < target_table > :: = { [ adatbázis_neve . séma_neve . | séma_neve . ] target_table } < merge_hint > :: = { { [ < table_hint_limited > [ ,... n ] ] [ [ , ] INDEX ( index_val [ ,... n ] ) ] } } < merge_search_condition > :: = < search_condition > < merge_matched > :: = { UPDATE SET < set_clause > | TÖRLÉS } < merge_not_matched > :: = { INSERT [ ( oszloplista ) ] { ÉRTÉKEK ( értékek_lista ) | ALAPÉRTÉKEK } } _ < záradék keresési_feltétele > :: = < keresési_feltétel >

ahol:

  • minden MERGE utasításnak pontosvesszővel kell végződnie. Ha nincs pontosvessző a MERGE utasítás végén, akkor hibaüzenet jelenik meg;
  • használhatja a SELECT @@RowCount parancsot a MERGE utasítás megírása után, amely visszaadja a tranzakció által módosított rekordok számát;
  • a MATCHED [3] záradékok egyike szükséges a MERGE utasítás működéséhez .

Érvek

A <közös_tábla_kifejezéssel>

Megad egy ideiglenes elnevezett eredményhalmazt vagy nézetet (más néven általános táblakifejezést), amely a MERGE utasítás hatókörében van definiálva. A MERGE utasítás által hivatkozott eredményhalmaz egy egyszerű lekérdezésből származik.

TOP ( kifejezés ) [ SZÁZALÉK ]

Meghatározza az érintett sorok számát vagy százalékát. kifejezés lehet egy szám vagy a sorok számának százaléka. A TOP kifejezés által hivatkozott sorok nincsenek meghatározott sorrendben.

adatbázis_neve

Annak az adatbázisnak a neve, ahol a céltábla található .

séma_neve

A séma neve, amelyhez a céltábla tartozik .

target_table

Az a tábla vagy nézet, amelyhez a <table_source> tábla adatsorait a <clause_search_condition> egyezteti. A target_table a MERGE utasítás WHEN záradékai által meghatározott beszúrási, frissítési vagy törlési műveletek célja. cél_tábla nem lehet távoli tábla. A target_table táblához nem lehetnek meghatározott szabályok .

A tippeket <merge_hint> formában lehet megadni.

[ AS ] table_alias

Alternatív neve a cél_tábla táblázathivatkozásainak .

<table_source> HASZNÁLATA

Megad egy adatforrást, amely a <merge_search feltétel> alapján le van képezve a target_table adatsoraira. Ennek az egyezésnek az eredménye határozza meg azokat a műveleteket, amelyeket a MERGE utasítás WHEN záradékai hajtanak végre. A <table_source> argumentum lehet távoli tábla vagy távoli táblákhoz hozzáférő nézet.

[ AS ] table_alias

Alternatív neve a táblaforrás táblahivatkozásainak.

ON <merge_search_condition>

Megadja azokat a feltételeket, amelyek mellett a <tábla_forrás> a céltáblához csatlakozik az egyeztetés érdekében. Meg kell adnia azokat a céltábla-oszlopokat, amelyek összehasonlításra kerülnek a megfelelő forrástábla oszlopával.

AMIKOR EGYEZTETVE AKKIN <merge_matched>

Megadja, hogy az összes *target_table sor, amely megfelel a <table_source> ON <merge_search_condition> kifejezés által visszaadott soroknak, és megfelel a további keresési feltételeknek, frissítésre vagy törlésre kerül a <merge_matched> záradéknak megfelelően.

A MERGE utasítás legfeljebb két WHEN MATCHED záradékot tartalmaz. Ha két tagmondat van megadva, az első záradékot egy ÉS <search_condition> záradéknak kell követnie.

AMIKOR NEM egyezik [ CÉL ÁLTAL ] AKKOR <merge_not_matched>

Megadja, hogy a rendszer beszúrjon egy sort a céltáblázatba a < table_source > ON < merge_search_condition > kifejezés által visszaadott minden olyan sorhoz, amely nem egyezik a céltábla egy sorával, de teljesít egy további keresési feltételt (ha van ilyen). A beszúrandó értékek a <merge_not_matched> záradékkal vannak megadva. A MERGE utasításnak csak egy WHEN NOT MATCHED [ BY TARGET ] záradéka lehet.

HA NEM egyezik meg FORRÁS ÁLTAL, AKKOR <merge_matched>

Megadja, hogy az összes *target_table sor, amely nem egyezik a <table_source> ON <merge_search_condition> kifejezés által visszaadott sorokkal, és megfelel a további keresési feltételeknek, frissítésre vagy törlésre kerül a <merge_matched> záradéknak megfelelően.

ÉS <clause_search_condition>

Bármely érvényes keresési kifejezés meg van adva.

<table_hint_limited>

A MERGE utasítás által végrehajtott minden egyes beszúrási, frissítési vagy törlési művelethez egy vagy több táblázati tippet ad meg a céltáblára. A WITH kulcsszó és a zárójelek megadása kötelező.

A NOLOCK és READUNCOMMITTED kulcsszavak nem engedélyezettek.

INDEX ( index_val [ ,...n ] )

Megadja egy vagy több index nevét vagy azonosítóját a céltáblában, hogy implicit összekapcsolást hajtson végre a forrástáblán.

<output_clause>

Egy sort ad vissza a target_table minden olyan sorához, amely frissítési, beszúrási vagy törlési műveletet tartalmaz, nem meghatározott sorrendben. Az $action paraméter a kimeneti záradékban adható meg. Az $action egy nvarchar(10) oszlop, amely minden sorhoz három érték egyikét adja vissza: INSERT, UPDATE vagy DELETE, az adott sorban végrehajtott műveletnek megfelelően. Az OUTPUT záradékot a MERGE záradék által érintett sorok lekérdezéséhez vagy számlálásához ajánljuk.

OPCIÓ ( <lekérdezés_tipp> [ ,...n ] )

Megadja, hogy az optimalizáló tippek segítségével testreszabható, hogy az adatbázismotor hogyan kezelje az utasítást.

<merge_matched>

Megadja a frissítési vagy törlési műveletet, amely a céltábla minden olyan sorára vonatkozik, amely nem egyezik a <table_source> ON <merge_search_condition> kifejezés által visszaadott sorokkal, és megfelel a további keresési feltételeknek .

UPDATE SET <set_clause>

Megadja a céltáblázatban frissítendő oszlop- vagy változónevek listáját, valamint a frissítendő értékeket.

TÖRLÉS

Megadja, hogy a cél_tábla sorainak megfelelő sorok eltávolításra kerülnek.

<merge_not_matched>

Megadja a céltáblázatba beszúrandó értékeket.

( oszlop_lista )

A céltábla egy vagy több oszlopának listája, amelybe az adatok beszúrásra kerülnek. Az oszlopokat egykomponensű névként kell megadni, ellenkező esetben a MERGE utasítás hibát ad vissza. Az oszlop_listát zárójelek közé kell tenni, elemeit vesszővel kell elválasztani.

ÉRTÉKEK ( értékek_lista )

Vesszővel elválasztott lista, amely konstansokat, változókat vagy kifejezéseket tartalmaz, amelyek a céltáblázatba beszúrandó értékeket adnak vissza. A kifejezések nem tartalmazhatnak EXECUTE utasítást.

ALAPÉRTÉKEK

Feltölti a beszúrt sort az egyes oszlopokhoz meghatározott alapértelmezett értékekkel.

<keresési_feltétel>

Beállítja a keresési feltételeket a <merge_search_condition> vagy a <clause_search_condition> megadására.

Grafikonillesztő sablont határoz meg.

Megjegyzések

A három MATCHED tagmondat közül legalább egyet meg kell adni, de tetszőleges sorrendben megadhatók. Egyetlen MATCHED záradékban egy változó nem frissíthető többször.

A MERGE utasítás által egy céltáblára alkalmazott törlésre, beszúrásra vagy frissítésre az adott táblára meghatározott összes korlátozás vonatkozik, beleértve a lépcsőzetes adatintegritási megkötéseket is. Ha az IGNORE_DUP_KEY BE van kapcsolva a céltábla bármely egyedi indexénél, akkor a MERGE utasítás figyelmen kívül hagyja ezt a beállítást.

A MERGE utasítás használatához pontosvessző (;) szükséges az utasítás végén. 10713-as hiba akkor fordul elő, ha egy MERGE utasítás konstrukciólezáró nélkül kerül végrehajtásra.

Példa

MERGE INTO table_name USING table_reference BE ( feltétel ) WHEN MATCHED THEN UPDATE SET oszlop1 = érték1 [, oszlop2 = érték2 ] WHEN NOT MATCHED THEN INSERT ( oszlop1 [, oszlop2 ]) ÉRTÉKEK ( érték1 [, érték2 ]);

Megvalósítások

Ez az operátor a következő adatbázis-kezelő rendszerekben van megvalósítva: Oracle Database, IBM Db2, Teradata, EXASOL, Firebird, CUBRID, H2, HSQLDB, MS SQL, Vectorwise és Apache Derby.

Ugyanezt az operátort használja a Microsoft Azure SQL adatbázis.

Jegyzetek

  1. SQL Server MERGE beszúráshoz, frissítéshez és törléshez  egyidejűleg . www.mssqltips.com . Letöltve: 2022. szeptember 22.
  2. ↑ 1 2 Aveek Das. Az SQL MERGE   utasítás megértése ? . SQL Shack – cikkek adatbázis-auditálásról, szerverteljesítményről, adat-helyreállításról és sok másról (2020. július 27.). Letöltve: 2022. szeptember 22.
  3. ↑ 1 2 mstehrani. MERGE (Transact-SQL ) - SQL Server   ? . learning.microsoft.com . Letöltve: 2022. szeptember 22.

Linkek

Forrás: https://web.archive.org/web/20111120170710/http://oracle-wiki.ru/wiki/Merge