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 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: 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 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.
-
Alias di tabella per la tabella di destinazione. L'alias non deve includere un elenco di colonne.
-
Nome tabella che identifica la tabella di origine da unire nella tabella di destinazione.
-
Alias di tabella per la tabella di origine. 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
le clausole vengono eseguite quando una riga di origine corrisponde a una riga della tabella di destinazione in base a e all'oggettomerge_condition
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 *
. Equivale aUPDATE 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: Databricks SQL Databricks Runtime 11.3 LTS e versioni successive
È possibile specificare
DEFAULT
comeexpr
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]
WHEN NOT MATCHED
le clausole inseriscono una riga quando una riga di origine non corrisponde ad alcuna riga di destinazione basata su e l'oggettomerge_condition
facoltativonot_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. 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: 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
WHEN NOT MATCHED BY SOURCE
le clausole vengono eseguite quando una riga di destinazione non corrisponde ad alcuna riga nella tabella di origine inmerge_condition
base a e l'opzione facoltativa restituiscenot_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: Databricks SQL Databricks Runtime 11.3 LTS e versioni successive
È possibile specificare
DEFAULT
comeexpr
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 restituiscemerge_condition
false può causare la modifica di un numero elevato di righe di destinazione. Per ottenere prestazioni ottimali, applicarenot_matched_by_source_condition
s 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. 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
WHEN NOT MATCHED BY SOURCE
condizioni restituisce true per una riga di destinazione che non corrisponde ad alcuna riga della tabella di origine basata sumerge_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