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 utasítás csak Delta Lake-táblák esetében támogatott.
Ez a lap a megfelelő szintaxis parancsokkal való MERGE
használatának részleteit tartalmazza. Tekintse meg az Upsert-et egy Delta Lake-táblában az egyesítés használatával, amely további útmutatást nyújt az adatok kezeléséhez használható MERGE
műveletekhez.
Szintaxis
MERGE 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 } } [, ...] }
Paraméterek
-
A módosítandó táblát azonosító táblanév . A hivatkozott táblának Delta-táblának kell lennie.
A tábla nem lehet idegen tábla.
-
A céltábla Tábla aliasa. Az alias nem tartalmazhat oszloplistát.
-
A céltáblába egyesíteni kívánt forrástáblát azonosító táblanév .
-
A forrástábla Tábla aliasa . 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
matched_condition]
WHEN MATCHED
záradékok akkor lesznek végrehajtva, ha egy forrássor megfelel a céltábla sorának a választható és amerge_condition
választhatómatch_condition
.matched_action
DELETE
Törli az egyező céltáblasort.
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ítések 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űUPDATE SET col1 = source.col1 [, col2 = source.col2 ...]
a cél Delta-tábla összes oszlopával. 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.Feljegyzés
Ez a viselkedés akkor változik, ha engedélyezve van az automatikus sémamigrálás. Részletekért tekintse meg a Delta Lake-egyesítés automatikus sémafejlődését .
A következőkre vonatkozik: Databricks SQL SQL Warehouse 2022.35-ös vagy újabb Databricks Runtime 11.2-es vagy újabb verziója
Megadhatja
DEFAULT
,expr
hogy az oszlopot explicit módon frissítse 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 mindenWHEN MATCHED
záradéknak rendelkeznie kell egymatched_condition
. Ellenkező esetben a lekérdezés NON_LAST_MATCHED_CLAUStandard kiadás_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
not_matched_condition]
WHEN NOT MATCHED
záradékok beszúrnak egy sort, ha egy forrássor nem egyezik meg egyetlen célsorsal sem a választható és amerge_condition
választhatónot_matched_condition
módon.A következőkre vonatkozik: Databricks SQL Databricks Runtime 12.1 vagy újabb
WHEN NOT MATCHED BY TARGET
a aliasaké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. Ez egyenértékű
INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...])
a cél Delta-tábla összes oszlopával. Ehhez a művelethez a forrástábla oszlopai megegyeznek a céltábla oszlopaiéval.Feljegyzés
Ez a viselkedés akkor változik, ha engedélyezve van az automatikus sémamigrálás. Részletekért tekintse meg a Delta Lake-egyesítés automatikus sémafejlődését .
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 SQL Warehouse 2022.35-ös vagy újabb Databricks Runtime 11.2-es vagy újabb verziója
Kifejezésként megadhatja
DEFAULT
, hogy explicit módon beszúrja a céloszlop alapértelmezett oszlopát.
Ha több
WHEN NOT MATCHED
záradék is létezik, a rendszer a megadott sorrendben értékeli ki őket. Az utolsó kivételével mindenWHEN NOT MATCHED
záradéknak s-nek kell lennienot_matched_condition
. Ellenkező esetben a lekérdezés NON_LAST_NOT_MATCHED_CLAUStandard kiadás_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.1 vagy újabb
WHEN NOT MATCHED BY SOURCE
a záradékok akkor lesznek végrehajtva, ha egy célsor nem egyezik a forrástábla egyik sorával sem azmerge_condition
alapján, hogy az opcionálisnot_match_by_source_condition
kiértékelése igaz-e.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áblasort.
UPDATE
Frissítések a céltábla 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 SQL Warehouse 2022.35-ös vagy újabb Databricks Runtime 11.2-es vagy újabb verziója
Megadhatja
DEFAULT
,expr
hogy az oszlopot explicit módon frissítse az alapértelmezett értékre.
Fontos
Ha hozzáad egy záradékot
WHEN NOT MATCHED BY SOURCE
a célsorok frissítéséhez vagy törléséhez, amikor amerge_condition
kiértékelések hamisak, nagy számú célsort módosíthat. A legjobb teljesítmény érdekében alkalmazzanot_matched_by_source_condition
az s értéket a frissített vagy törölt célsorok számának korlátozására.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 rendelkeznie kell egynot_matched_by_source_condition
. Ellenkező esetben a lekérdezés NON_LAST_NOT_MATCHED_BY_SOURCE_CLAUStandard kiadás_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 azmerge_condition
alapján, akkor a célsor változatlan marad.
Fontos
Egy MERGE
művelet DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE hibával hiúsulhat meg, ha a forrásadatkészlet több sora egyezik, és megkísérli frissíteni a cél Delta-tábla ugyanazon sorait. Az egyesítés SQL-szemantikája szerint az ilyen frissítési művelet nem egyértelmű, mivel 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 az Adatrögzítés módosítása példát– a módosítási adatkészletet (vagyis a forrásadatkészletet) előre feldolgozva csak az egyes kulcsok legújabb változásait őrzi meg, mielőtt a módosítást a cél Delta-táblára alkalmazza.
Példák
Olyan összetett műveletekhez használható MERGE INTO
, mint az adatok deduplikálása, a változásadatok feltöltése, az SCD 2. típusú műveletek alkalmazása stb. Tekintse meg az Upsert-et egy Delta Lake-táblában az egyesítéssel néhány példa alapján.
WHEN MATCHED
-- 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
WHEN NOT MATCHED [BY TARGET]
-- 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)
WHEN NOT MATCHED BY SOURCE
-- 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