Condividi tramite


MERGE INTO

Si applica a:segno di spunta sì Databricks SQL segno di spunta sì Databricks Runtime

Unisce un set di aggiornamenti, inserimenti ed eliminazioni in base a una tabella di origine in una tabella Delta di destinazione.

Questa istruzione è supportata solo per le tabelle Delta Lake.

Questa pagina contiene informazioni dettagliate sull'uso della sintassi corretta con il MERGE comando . Per altre informazioni su come usare le operazioni di per gestire i dati, vedere MERGE.

Sintassi

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

Parametri

  • WITH SCHEMA EVOLUTION

    Si applica a:segno di spunta sì Databricks Runtime 15.2 e versioni successive

    Abilita l'evoluzione automatica dello schema per questa MERGE operazione. Se abilitato, lo schema della tabella Delta di destinazione viene aggiornato automaticamente in modo che corrisponda allo schema della tabella di origine.

  • target_table_name

    Nome della tabella che identifica la tabella in fase di modifica. La tabella a cui si fa riferimento deve essere una tabella Delta.

    Il nome non deve includere una specifica delle opzioni.

    La tabella non deve essere una tabella esterna.

  • target_alias

    Un alias tavolo per la tabella di destinazione. L'alias non deve includere un elenco di colonne.

  • source_table_reference

    Un nome di tabella per identificare la tabella di origine da unire nella tabella di destinazione.

  • source_alias

    Alias di tabella per la tabella sorgente. L'alias non deve includere un elenco di colonne.

  • ON merge_condition

    Modalità di combinazione delle righe di una relazione con le righe di un'altra relazione. Espressione con tipo restituito BOOLEAN.

  • WHEN MATCHED [ AND matched_condition]

    WHEN MATCHED clausole vengono eseguite quando una riga di origine corrisponde a una riga della tabella di destinazione in base al merge_condition e al facoltativo match_condition.

  • matched_action

    • DELETE

      Elimina la riga della tabella di destinazione corrispondente.

      Quando le corrispondenze vengono eliminate in modo incondizionato, sono consentite più corrispondenze. Un'eliminazione non condizionale non è ambigua, anche se sono presenti più corrispondenze.

    • UPDATE

      Aggiorna la riga della tabella di destinazione corrispondente.

      Per aggiornare tutte le colonne della tabella Delta di destinazione con le colonne corrispondenti del set di dati di origine, usare UPDATE SET *. Per tutte le colonne della tabella Delta di destinazione, questo equivale a UPDATE SET col1 = source.col1 [, col2 = source.col2 ...]. Pertanto, questa azione presuppone che la tabella di origine abbia le stesse colonne della tabella di destinazione. In caso contrario, la query genererà un errore di analisi.

      Nota

      Questo comportamento cambia quando è abilitata l'evoluzione automatica dello schema. Per informazioni dettagliate, vedere evoluzione automatica dello schema per il merge di Delta Lake.

      Si applica a:segno di spunta sì Databricks SQL segno di spunta sì Databricks Runtime 11.3 LTS e versioni successive

      È possibile specificare DEFAULT come expr per aggiornare in modo esplicito la colonna al valore predefinito.

    Se sono presenti più WHEN MATCHED clausole, vengono valutate nell'ordine in cui vengono specificate. Ogni WHEN MATCHED clausola, ad eccezione dell'ultima, deve avere un oggetto matched_condition. In caso contrario, la query restituisce un errore NON_LAST_MATCHED_CLAUSE_OMIT_CONDITION .

    Se nessuna delle condizioni restituisce true per una coppia di righe di WHEN MATCHED origine e di destinazione corrispondente merge_conditiona , la riga di destinazione viene lasciata invariata.

  • WHEN NOT MATCHED [BY TARGET] [ AND not_matched_condition]

    Le clausole WHEN NOT MATCHED inseriscono una riga quando una riga di origine non corrisponde a nessuna riga di destinazione in base a merge_condition e all'opzionale not_matched_condition.

    Si applica a:segno di spunta sì Databricks SQL segno di spunta sì Databricks Runtime 12.2 LTS e versioni successive

    WHEN NOT MATCHED BY TARGET può essere usato come alias per WHEN NOT MATCHED.

    not_matched_condition deve essere un'espressione booleana.

    • INSERT *

      Inserisce tutte le colonne della tabella Delta di destinazione con le colonne corrispondenti del set di dati di origine. Per tutte le colonne della tabella Delta di destinazione, questo equivale a INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...]). Questa azione richiede che la tabella di origine abbia le stesse colonne della tabella di destinazione.

      Nota

      Questo comportamento cambia quando è abilitata l'evoluzione automatica dello schema. Per informazioni dettagliate, vedere evoluzione automatica dello schema per il merge di Delta Lake.

    • INSERT ( ... ) VALUES ( ... )

      La nuova riga viene generata in base alla colonna specificata e alle espressioni corrispondenti. Non è necessario specificare tutte le colonne nella tabella di destinazione. Per le colonne di destinazione non specificate, viene inserito il valore predefinito della colonna, oppure NULL se quest'ultimo non esiste.

      Si applica a:segno di spunta sì Databricks SQL segno di spunta sì Databricks Runtime 11.3 LTS e versioni successive

      È possibile specificare DEFAULT come espressione per inserire in modo esplicito il valore predefinito della colonna per una colonna di destinazione.

    Se sono presenti più WHEN NOT MATCHED clausole, vengono valutate nell'ordine in cui vengono specificate. Tutte le WHEN NOT MATCHED clausole, ad eccezione dell'ultima, devono avere not_matched_conditions. In caso contrario, la query restituisce un errore di NON_LAST_NOT_MATCHED_CLAUSE_OMIT_CONDITION .

  • WHEN NOT MATCHED BY SOURCE [ AND not_matched_by_source_condition]

    Si applica a:segno di spunta sì Databricks SQL segno di spunta sì Databricks Runtime 12.2 LTS e versioni successive

    Le clausole WHEN NOT MATCHED BY SOURCE vengono eseguite quando una riga di destinazione non corrisponde a nessuna riga nella tabella di origine in base a merge_condition e l'opzionale not_match_by_source_condition restituisce vero.

    not_matched_by_source_condition deve essere un'espressione booleana che fa riferimento solo alle colonne della tabella di destinazione.

  • not_matched_by_source_action

    • DELETE

      Elimina la riga della tabella di destinazione.

    • UPDATE

      Aggiorna la riga della tabella di destinazione. expr può fare riferimento solo a colonne della tabella di destinazione. In caso contrario, la query genererà un errore di analisi.

      Si applica a:segno di spunta sì Databricks SQL segno di spunta sì Databricks Runtime 11.3 LTS e versioni successive

      È possibile specificare DEFAULT come expr per aggiornare in modo esplicito la colonna al valore predefinito.

    Importante

    L'aggiunta di una clausola WHEN NOT MATCHED BY SOURCE per aggiornare o eliminare le righe di destinazione quando il merge_condition restituisce false può causare la modifica di un numero elevato di righe di destinazione. Per ottenere le migliori prestazioni, applicare not_matched_by_source_conditions per limitare il numero di righe di destinazione che vengono aggiornate o eliminate.

    Se sono presenti più WHEN NOT MATCHED BY SOURCE clauses, vengono valutati nell'ordine in cui vengono specificati. Ogni WHEN NOT MATCHED BY SOURCE clausola, ad eccezione dell'ultima, deve avere un oggetto not_matched_by_source_condition. In caso contrario, la query restituisce un errore NON_LAST_NOT_MATCHED_BY_SOURCE_CLAUSE_OMIT_CONDITION .

    Se nessuna delle condizioni di WHEN NOT MATCHED BY SOURCE restituisce true per una riga di destinazione che non corrisponde ad alcuna riga della tabella di origine in base alla merge_condition, la riga di destinazione rimane invariata.

Importante

MERGE operazioni hanno esito negativo con un errore DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE se più righe della tabella di origine corrispondono alla stessa riga nella tabella di destinazione in base alle condizioni specificate nelle clausole ON e WHEN MATCHED. In base alla semantica SQL di merge, questo tipo di operazione di aggiornamento è ambiguo perché non è chiaro quale riga di origine deve essere usata per aggiornare la riga di destinazione corrispondente. È possibile pre-elaborare la tabella di origine per eliminare la possibilità di corrispondenze multiple. Vedere l'esempio di Change Data Capture. Questo esempio pre-elabora il set di dati delle modifiche (set di dati di origine) per mantenere solo la modifica più recente per ogni chiave prima di applicare tale modifica alla tabella Delta di destinazione. In Databricks Runtime 15.4 LTS e versioni successive considera MERGE solo le condizioni nella ON clausola prima di valutare più corrispondenze.

Esempi

È possibile utilizzare MERGE INTO per operazioni complesse, come la deduplicazione dei dati, l'aggiornamento dei dati delle modifiche, l'applicazione di operazioni di tipo 2 SCD e così via. Per alcuni esempi, consultare Upsert in una tabella Delta Lake usando merge.

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