MERGE INTO

A következőkre vonatkozik:check marked yes Databricks SQL check marked yes 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

  • target_table_name

    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.

  • target_alias

    A céltábla Tábla aliasa. Az alias nem tartalmazhat oszloplistát.

  • source_table_reference

    A céltáblába egyesíteni kívánt forrástáblát azonosító táblanév .

  • source_alias

    A forrástábla Tábla aliasa . Az alias nem tartalmazhat oszloplistát.

  • ON merge_condition

    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 a merge_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:check marked yes Databricks SQL SQL Warehouse 2022.35-ös vagy újabb Databricks Runtime 11.2-es vagy újabb verziója check marked yes

      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 minden WHEN MATCHED záradéknak rendelkeznie kell egy matched_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 a merge_conditionfelté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 a merge_condition választható not_matched_conditionmódon.

    A következőkre vonatkozik:check marked yes Databricks SQL check marked yes Databricks Runtime 12.1 vagy újabb

    WHEN NOT MATCHED BY TARGETa 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:check marked yes Databricks SQL SQL Warehouse 2022.35-ös vagy újabb Databricks Runtime 11.2-es vagy újabb verziója check marked yes

      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 minden WHEN NOT MATCHED záradéknak s-nek kell lennie not_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:check marked yes Databricks SQL check marked yes 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 az merge_condition alapján, hogy az opcionális not_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:check marked yes Databricks SQL SQL Warehouse 2022.35-ös vagy újabb Databricks Runtime 11.2-es vagy újabb verziója check marked yes

      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 a merge_condition kiértékelések hamisak, nagy számú célsort módosíthat. A legjobb teljesítmény érdekében alkalmazza not_matched_by_source_conditionaz 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 clausesvan, akkor a rendszer a megadott sorrendben értékeli ki őket. Az utolsó kivételével minden WHEN NOT MATCHED BY SOURCE záradéknak rendelkeznie kell egy not_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 az merge_conditionalapjá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