MERGE INTO
Si applica a: Databricks SQL
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:
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.-
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.
-
Un alias tavolo per la tabella di destinazione. L'alias non deve includere un elenco di colonne.
-
Un nome di tabella per identificare la tabella di origine da unire nella tabella di destinazione.
-
Alias di tabella per la tabella sorgente. L'alias non deve includere un elenco di colonne.
-
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 almerge_condition
e al facoltativomatch_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 aUPDATE 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:
Databricks SQL
Databricks Runtime 11.3 LTS e versioni successive
È possibile specificare
DEFAULT
comeexpr
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. OgniWHEN MATCHED
clausola, ad eccezione dell'ultima, deve avere un oggettomatched_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 corrispondentemerge_condition
a , 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 amerge_condition
e all'opzionalenot_matched_condition
.Si applica a:
Databricks SQL
Databricks Runtime 12.2 LTS e versioni successive
WHEN NOT MATCHED BY TARGET
può essere usato come alias perWHEN 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:
Databricks SQL
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 leWHEN NOT MATCHED
clausole, ad eccezione dell'ultima, devono averenot_matched_condition
s. 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:
Databricks SQL
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 amerge_condition
e l'opzionalenot_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:
Databricks SQL
Databricks Runtime 11.3 LTS e versioni successive
È possibile specificare
DEFAULT
comeexpr
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 ilmerge_condition
restituisce false può causare la modifica di un numero elevato di righe di destinazione. Per ottenere le migliori prestazioni, applicarenot_matched_by_source_condition
s 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. OgniWHEN NOT MATCHED BY SOURCE
clausola, ad eccezione dell'ultima, deve avere un oggettonot_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 allamerge_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