MERGE INTO
A következőkre vonatkozik: Databricks SQL
Databricks Runtime
A forrástáblán alapuló frissítések, beszúrások és törlések halmazát egyesíti egy cél Delta-táblával.
Ez az állítás csak a Delta Lake táblák esetében támogatott.
Ez a lap a megfelelő szintaxis parancsokkal való MERGE
használatának részleteit tartalmazza. További útmutatásért az adatok kezeléséhez a MERGE
műveletek segítségével, tekintse meg a szakaszt, amely az Upsert egy Delta Lake-táblába történő végrehajtását magyarázza az egyesítési használatával.
MERGE [ WITH SCHEMA EVOLUTION ] INTO target_table_name [target_alias]
USING source_table_reference [source_alias]
ON merge_condition
{ WHEN MATCHED [ AND matched_condition ] THEN matched_action |
WHEN NOT MATCHED [BY TARGET] [ AND not_matched_condition ] THEN not_matched_action |
WHEN NOT MATCHED BY SOURCE [ AND not_matched_by_source_condition ] THEN not_matched_by_source_action } [...]
matched_action
{ DELETE |
UPDATE SET * |
UPDATE SET { column = { expr | DEFAULT } } [, ...] }
not_matched_action
{ INSERT * |
INSERT (column1 [, ...] ) VALUES ( expr | DEFAULT ] [, ...] )
not_matched_by_source_action
{ DELETE |
UPDATE SET { column = { expr | DEFAULT } } [, ...] }
WITH SCHEMA EVOLUTION
A következőkre vonatkozik:
Databricks Runtime 15.2 vagy újabb
Engedélyezi az automatikus sémafejlődést ehhez a
MERGE
művelethez. Ha engedélyezve van, a cél Delta-tábla sémája automatikusan frissül a forrástábla sémájának megfelelően.-
A táblanév azonosítja a módosítandó táblát. A hivatkozott táblának Delta-táblának kell lennie.
A név nem tartalmazhat beállításspecifikációt.
A tábla nem lehet idegen tábla.
-
A céltáblához tartozó tábla álneve. Az alias nem tartalmazhat oszloplistát.
-
Egy táblanév, amely azonosítja a céltáblába egyesítendő forrástáblát.
-
A forrástáblához tartozó Table alias. Az alias nem tartalmazhat oszloplistát.
-
Az egyik reláció sorainak kombinálása egy másik reláció soraival. Logikai érték visszatérési típusával rendelkező kifejezés.
WHEN MATCHED [ AND
megfelelő_feltétel]
Az
WHEN MATCHED
feltételek akkor lesznek végrehajtva, ha egy forrássor megfelel a céltábla sorának amerge_condition
és az opcionálismatch_condition
alapján.illesztett_művelet
DELETE
Törli az egyező cél táblázat sorát.
A találatok feltétel nélküli törlése esetén több találat is engedélyezett. A feltétel nélküli törlés nem egyértelmű, még akkor sem, ha több egyezés van.
UPDATE
Frissíti a megfeleltethető céltáblasort.
Ha frissíteni szeretné a cél Delta-tábla összes oszlopát a forrásadatkészlet megfelelő oszlopaival, használja a következőt
UPDATE SET *
: . Ez egyenértékű a cél Delta tábla összes oszlopánakUPDATE SET col1 = source.col1 [, col2 = source.col2 ...]
értékével. Ezért ez a művelet feltételezi, hogy a forrástábla oszlopai megegyeznek a céltáblában szereplő oszlopokkal, ellenkező esetben a lekérdezés elemzési hibát okoz.Megjegyzés
Ez a viselkedés megváltozik, ha engedélyezve van az automatikus sémafejlődés. Részletekért tekintse meg Delta Lake-egyesítési automatikus sémafejlődését.
A következőkre vonatkozik:
Databricks SQL
Databricks Runtime 11.3 LTS és újabb
Megadhatja a
DEFAULT
-texpr
-ként, hogy explicit módon frissítse az oszlopot az alapértelmezett értékre.
Ha több
WHEN MATCHED
záradék is létezik, a rendszer a megadott sorrendben értékeli ki őket. Az utolsó kivételével minden egyesWHEN MATCHED
záradéknak rendelkeznie kellmatched_condition
-lel. Ellenkező esetben a lekérdezés NON_LAST_MATCHED_CLAUSE_OMIT_CONDITION hibát ad vissza.Ha egyik
WHEN MATCHED
feltétel sem lesz igaz a forrás- és célsorpár esetében, amely megfelel amerge_condition
feltételnek, akkor a célsor változatlan marad.WHEN NOT MATCHED [BY TARGET] [ AND
nem_illeszkedő_feltétel]
WHEN NOT MATCHED
záradékok akkor szúrnak be egy sort, ha egy forrássor nem egyezik meg a célsorokkal amerge_condition
és az opcionálisnot_matched_condition
alapján.A következőkre vonatkozik:
Databricks SQL
Databricks Runtime 12.2 LTS és újabb
WHEN NOT MATCHED BY TARGET
álneveként használhatóWHEN NOT MATCHED
.not_matched_condition
logikai kifejezésnek kell lennie.INSERT *
Beszúrja a cél Delta-tábla összes oszlopát a forrásadatkészlet megfelelő oszlopaival. A
INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...])
ekvivalens a célzott Delta-tábla összes oszlopának. Ehhez a művelethez a forrástábla oszlopai megegyeznek a céltábla oszlopaiéval.INSERT ( ... ) VALUES ( ... )
Az új sor a megadott oszlop és a hozzájuk tartozó kifejezések alapján jön létre. A céltábla összes oszlopát nem kell megadni. Meghatározatlan céloszlopok esetén a program beszúrja az alapértelmezett oszlopot, vagy
NULL
, ha nincs ilyen.A következőkre vonatkozik:
Databricks SQL
Databricks Runtime 11.3 LTS és újabb
A
DEFAULT
kifejezést adhatja meg, hogy az alapértelmezett céloszlopot explicit módon beilleszthesse.
Ha több
WHEN NOT MATCHED
záradék is létezik, a rendszer a megadott sorrendben értékeli ki őket. MindenWHEN NOT MATCHED
záradéknak lennie kellnot_matched_condition
-nek, kivéve az utolsót. Ellenkező esetben a lekérdezés egy NON_LAST_NOT_MATCHED_CLAUSE_OMIT_CONDITION hibát ad vissza.WHEN NOT MATCHED BY SOURCE [ AND
not_matched_by_source_condition]
A következőkre vonatkozik:
Databricks SQL
Databricks Runtime 12.2 LTS és újabb
WHEN NOT MATCHED BY SOURCE
záradékok akkor lesznek végrehajtva, ha egy célsor nem egyezik a forrástábla egyik sorával sem amerge_condition
alapján, és az opcionálisnot_match_by_source_condition
igaz értékre értékeli.not_matched_by_source_condition
logikai kifejezésnek kell lennie, amely csak a céltáblából származó oszlopokra hivatkozik.not_matched_by_source_action
DELETE
Törli a céltáblázat sorát.
UPDATE
Frissíti a cél táblázat sorát.
expr
csak a céltáblából származó oszlopokra hivatkozhat, ellenkező esetben a lekérdezés elemzési hibát jelez.A következőkre vonatkozik:
Databricks SQL
Databricks Runtime 11.3 LTS és újabb
Megadhatja
DEFAULT
expr
, hogy explicit módon frissítse az oszlopot az alapértelmezett értékre.
Fontos
WHEN NOT MATCHED BY SOURCE
záradék hozzáadása a célsorok frissítéséhez vagy törléséhez, amikor amerge_condition
hamis értéket ad, ahhoz vezethet, hogy a célsorok nagy számban módosulnak. A legjobb teljesítmény érdekében alkalmazzanot_matched_by_source_condition
s-eket a frissített vagy törölt célsorok számának korlátozásához.Ha több
WHEN NOT MATCHED BY SOURCE clauses
van, akkor a rendszer a megadott sorrendben értékeli ki őket. Az utolsó kivételével mindenWHEN NOT MATCHED BY SOURCE
záradéknak kell hogy legyen egynot_matched_by_source_condition
. Ellenkező esetben a lekérdezés NON_LAST_NOT_MATCHED_BY_SOURCE_CLAUSE_OMIT_CONDITION hibát ad vissza.Ha a
WHEN NOT MATCHED BY SOURCE
feltételek egyike sem lesz igaz egy olyan célsor esetében, amely nem felel meg a forrástábla egyik sorának sem amerge_condition
alapján, akkor a célsor változatlan marad.
Fontos
A MERGE
műveletek DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE hibával szakadnak meg, ha a forrástáblában több sor is illeszkedik a céltábla ugyanazon sorára a ON
és WHEN MATCHED
záradékokban megadott feltételek alapján. Az egyesítés SQL-szemantikája szerint ez a frissítési művelet nem egyértelmű, mert nem világos, hogy melyik forrássort kell használni a megfeleltetett célsor frissítéséhez. A forrástábla előfeldolgozásával kiküszöbölheti a több egyezés lehetőségét. Tekintse meg a változás adatrögzítési példáját. Ez a példa előre feldolgozta a módosítási adatkészletet (a forrásadatkészletet), hogy csak az egyes kulcsok legújabb változásait őrizze meg, mielőtt a módosítást a cél Delta-táblára alkalmazza. A Databricks Runtime 15.4 LTS-ben és az alábbi MERGE
verziókban csak a ON
záradékban szereplő feltételeket veszi figyelembe több találat kiértékelése előtt.
A MERGE INTO
olyan összetett műveletekhez használhatja, mint az adatok deduplikálása, a változásadatok feltöltése, az SCD 2. típusú műveletek alkalmazása stb. Néhány példa: Upsert egy Delta Lake-táblába egyesítési használatával.
-- Delete all target rows that have a match in the source table.
> MERGE INTO target USING source
ON target.key = source.key
WHEN MATCHED THEN DELETE
-- Conditionally update target rows that have a match in the source table using the source value.
> MERGE INTO target USING source
ON target.key = source.key
WHEN MATCHED AND target.updated_at < source.updated_at THEN UPDATE SET *
-- Multiple MATCHED clauses conditionally deleting matched target rows and updating two columns for all other matched rows.
> MERGE INTO target USING source
ON target.key = source.key
WHEN MATCHED AND target.marked_for_deletion THEN DELETE
WHEN MATCHED THEN UPDATE SET target.updated_at = source.updated_at, target.value = DEFAULT
-- Insert all rows from the source that are not already in the target table.
> MERGE INTO target USING source
ON target.key = source.key
WHEN NOT MATCHED THEN INSERT *
-- Conditionally insert new rows in the target table using unmatched rows from the source table.
> MERGE INTO target USING source
ON target.key = source.key
WHEN NOT MATCHED BY TARGET AND source.created_at > now() - INTERVAL “1” DAY THEN INSERT (created_at, value) VALUES (source.created_at, DEFAULT)
-- Delete all target rows that have no matches in the source table.
> MERGE INTO target USING source
ON target.key = source.key
WHEN NOT MATCHED BY SOURCE THEN DELETE
-- Multiple NOT MATCHED BY SOURCE clauses conditionally deleting unmatched target rows and updating two columns for all other matched rows.
> MERGE INTO target USING source
ON target.key = source.key
WHEN NOT MATCHED BY SOURCE AND target.marked_for_deletion THEN DELETE
WHEN NOT MATCHED BY SOURCE THEN UPDATE SET target.value = DEFAULT
-- Multiple MATCHED and NOT MATCHED clauses with schema evolution enabled.
> MERGE WITH SCHEMA EVOLUTION INTO target USING source
ON source.key = target.key
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *
WHEN NOT MATCHED BY SOURCE THEN DELETE