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 indicazioni su come usare le operazioni per gestire i dati, vedere Upsert in una tabella Delta Lake usando l'unioneMERGE.

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 tabella che identifica la tabella da modificare. 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

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

  • source_table_reference

    Nome tabella che identifica la tabella di origine da unire nella tabella di destinazione.

  • source_alias

    Alias di tabella per la tabella di origine. 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 le clausole vengono eseguite quando una riga di origine corrisponde a una riga della tabella di destinazione in base a e all'oggetto merge_condition 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 *. Equivale a UPDATE SET col1 = source.col1 [, col2 = source.col2 ...] per tutte le colonne della tabella Delta di destinazione. 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 l'unione 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 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]

    WHEN NOT MATCHED le clausole inseriscono una riga quando una riga di origine non corrisponde ad alcuna riga di destinazione basata su e l'oggetto merge_condition facoltativo 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. Equivale a INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...]) per tutte le colonne della tabella Delta di destinazione. 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 l'unione 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, l'impostazione predefinita della colonna viene inserita o NULL se 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

    WHEN NOT MATCHED BY SOURCE le clausole vengono eseguite quando una riga di destinazione non corrisponde ad alcuna riga nella tabella di origine in merge_condition base a e l'opzione facoltativa restituisce not_match_by_source_condition true.

    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 alle 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 aggiornare in modo esplicito la colonna al valore predefinito.

    Importante

    L'aggiunta di una WHEN NOT MATCHED BY SOURCE clausola per aggiornare o eliminare le righe di destinazione quando restituisce merge_condition false può causare la modifica di un numero elevato di righe di destinazione. Per ottenere prestazioni ottimali, applicare not_matched_by_source_conditions per limitare il numero di righe di destinazione 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 WHEN NOT MATCHED BY SOURCE condizioni restituisce true per una riga di destinazione che non corrisponde ad alcuna riga della tabella di origine basata su merge_condition, la riga di destinazione viene lasciata invariata.

Importante

MERGE le 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 ON clausole 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 più corrispondenze. 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 usare MERGE INTO per operazioni complesse, ad esempio la deduplicazione dei dati, l'upserting dei dati delle modifiche, l'applicazione di operazioni scD Type 2 e così via. Per alcuni esempi, vedere Upsert in una tabella Delta Lake usando l'unione .

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