Olvasás angol nyelven

Megosztás a következőn keresztül:


MERGE INTO

A következőkre vonatkozik:jelölje be az igennel jelölt jelölőnégyzetet Databricks SQL jelölje be az igennel jelölt jelölőnégyzetet 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.

Szintaxis

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 } } [, ...] }

Paraméterek

  • WITH SCHEMA EVOLUTION

    A következőkre vonatkozik:jelölje be az igennel jelölt jelölőnégyzetet 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.

  • target_table_name

    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.

  • target_alias

    A céltáblához tartozó tábla álneve. Az alias nem tartalmazhat oszloplistát.

  • forrástábla_hivatkozás

    Egy táblanév, amely azonosítja a céltáblába egyesítendő forrástáblát.

  • forrás_alias

    A forrástáblához tartozó Table alias. Az alias nem tartalmazhat oszloplistát.

  • ON merge_feltétel

    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 a merge_condition és az opcionális match_conditionalapjá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ának UPDATE 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:jelölje be az igennel jelölt jelölőnégyzetet Databricks SQL jelölje be az igennel jelölt jelölőnégyzetet Databricks Runtime 11.3 LTS és újabb

      Megadhatja a DEFAULT-t expr-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 egyes WHEN MATCHED záradéknak rendelkeznie kell matched_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 a merge_conditionfelté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 a merge_condition és az opcionális not_matched_conditionalapján.

    A következőkre vonatkozik:jelölje be az igennel jelölt jelölőnégyzetet Databricks SQL jelölje be az igennel jelölt jelölőnégyzetet 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.

      Megjegyzés

      Ez a viselkedés megváltozik, ha engedélyezve van az automatikus sémafejlődé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:jelölje be az igennel jelölt jelölőnégyzetet Databricks SQL jelölje be az igennel jelölt jelölőnégyzetet 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. Minden WHEN NOT MATCHED záradéknak lennie kell not_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:jelölje be az igennel jelölt jelölőnégyzetet Databricks SQL jelölje be az igennel jelölt jelölőnégyzetet 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 a merge_condition alapján, és az opcionális not_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:jelölje be az igennel jelölt jelölőnégyzetet Databricks SQL jelölje be az igennel jelölt jelölőnégyzetet Databricks Runtime 11.3 LTS és újabb

      Megadhatja DEFAULTexpr, 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 a merge_condition hamis értéket ad, ahhoz vezethet, hogy a célsorok nagy számban módosulnak. A legjobb teljesítmény érdekében alkalmazza not_matched_by_source_conditions-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 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 kell hogy legyen egy not_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 a merge_conditionalapjá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.

Példák

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.

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

WITH SCHEMA EVOLUTION

-- 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