MERGE INTO
Şunlar için geçerlidir: Databricks SQL Databricks Runtime
Kaynak tabloyu temel alan bir dizi güncelleştirme, ekleme ve silmeyi hedef Delta tablosuyla birleştirir.
Bu deyim yalnızca Delta Lake tabloları için desteklenir.
Bu sayfa, komutuyla MERGE
doğru söz dizimini kullanmanın ayrıntılarını içerir. Verilerinizi yönetmek için işlemleri kullanma MERGE
hakkında daha fazla kılavuz için bkz. Birleştirmeyi kullanarak Delta Lake tablosuna ekleme.
Sözdizimi
MERGE 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 } } [, ...] }
Parametreler
-
Değiştirilmekte olan tabloyu tanımlayan tablo adı. Başvuruda bulunılan tablo bir Delta tablosu olmalıdır.
Tablo yabancı bir tablo olmamalıdır.
-
Hedef tablo için tablo diğer adı. Diğer ad bir sütun listesi içermemelidir.
-
Hedef tabloyla birleştirilecek kaynak tabloyu tanımlayan tablo adı.
-
Kaynak tablo için tablo diğer adı. Diğer ad bir sütun listesi içermemelidir.
-
Bir ilişkideki satırların başka bir ilişkinin satırlarıyla nasıl birleştirildiği. Dönüş türü BOOLEAN olan bir ifade.
WHEN MATCHED [ AND
matched_condition]
WHEN MATCHED
yan tümceleri, bir kaynak satır ve isteğe bağlımatch_condition
temelinde bir hedef tablo satırıylamerge_condition
eşleştiğinde yürütülür.matched_action
DELETE
Eşleşen hedef tablo satırını siler.
Eşleşmeler koşulsuz olarak silindiğinde birden çok eşleşmeye izin verilir. Birden çok eşleşme olsa bile koşulsuz silme işlemi belirsiz değildir.
UPDATE
Eşleşen hedef tablo satırını Güncelleştirmeler.
Hedef Delta tablosunun tüm sütunlarını kaynak veri kümesinin ilgili sütunlarıyla güncelleştirmek için kullanın
UPDATE SET *
. Bu, hedef Delta tablosunun tüm sütunları için eşdeğerdirUPDATE SET col1 = source.col1 [, col2 = source.col2 ...]
. Bu nedenle, bu eylem kaynak tablonun hedef tablodakilerle aynı sütunlara sahip olduğunu varsayar, aksi takdirde sorgu bir çözümleme hatası oluşturur.Not
Otomatik şema geçişi etkinleştirildiğinde bu davranış değişir. Ayrıntılar için bkz . Delta Lake birleştirme için otomatik şema evrimi.
Şunlar için geçerlidir: Databricks SQL Databricks Runtime 11.3 LTS ve üzeri
Sütunu varsayılan değerine açıkça güncelleştirmek için olarak
expr
belirtebilirsinizDEFAULT
.
Birden çok
WHEN MATCHED
yan tümce varsa, bunlar belirtildikleri sırayla değerlendirilir. Son yan tümcesi dışında herWHEN MATCHED
yan tümcenin birmatched_condition
olması gerekir. Aksi takdirde, sorgu bir NON_LAST_MATCHED_CLAUSE_OMIT_CONDITION hatası döndürür.Koşulların
WHEN MATCHED
hiçbiri ile eşleşenmerge_condition
bir kaynak ve hedef satır çifti için true olarak değerlendirilmezse, hedef satır değişmeden bırakılır.WHEN NOT MATCHED [BY TARGET] [ AND
not_matched_condition]
WHEN NOT MATCHED
yan tümceleri, bir kaynak satır ve isteğe bağlınot_matched_condition
temelindemerge_condition
herhangi bir hedef satırla eşleşmediğinde bir satır ekler.Şunlar için geçerlidir: Databricks SQL Databricks Runtime 12.2 LTS ve üzeri
WHEN NOT MATCHED BY TARGET
içinWHEN NOT MATCHED
diğer ad olarak kullanılabilir.not_matched_condition
bir Boole ifadesi olmalıdır.INSERT *
Hedef Delta tablosunun tüm sütunlarını kaynak veri kümesinin ilgili sütunlarıyla ekler. Bu, hedef Delta tablosunun tüm sütunları için eşdeğerdir
INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...])
. Bu eylem, kaynak tablonun hedef tablodaki sütunlarla aynı sütunlara sahip olmasını gerektirir.Not
Otomatik şema geçişi etkinleştirildiğinde bu davranış değişir. Ayrıntılar için bkz . Delta Lake birleştirme için otomatik şema evrimi.
INSERT ( ... ) VALUES ( ... )
Yeni satır, belirtilen sütuna ve karşılık gelen ifadelere göre oluşturulur. Hedef tablodaki tüm sütunların belirtilmesi gerekmez. Belirtilmemiş hedef sütunlar için varsayılan sütun eklenir veya
NULL
yoksa.Şunlar için geçerlidir: Databricks SQL Databricks Runtime 11.3 LTS ve üzeri
Hedef sütun için varsayılan sütunu açıkça eklemek üzere ifade olarak belirtebilirsiniz
DEFAULT
.
Birden çok
WHEN NOT MATCHED
yan tümce varsa, bunlar belirtildikleri sırayla değerlendirilir. Son yan tümcesi dışında tümWHEN NOT MATCHED
yan tümcelerde s olmalıdırnot_matched_condition
. Aksi takdirde, sorgu bir NON_LAST_NOT_MATCHED_CLAUSE_OMIT_CONDITION hatası döndürür.WHEN NOT MATCHED BY SOURCE [ AND
not_matched_by_source_condition]
Şunlar için geçerlidir: Databricks SQL Databricks Runtime 12.2 LTS ve üzeri
WHEN NOT MATCHED BY SOURCE
yan tümceleri, hedef satır temel alınarakmerge_condition
kaynak tablodaki hiçbir satırla eşleşmediğinde yürütülür ve isteğe bağlınot_match_by_source_condition
değer true olarak değerlendirilir.not_matched_by_source_condition
yalnızca hedef tablodaki sütunlara başvuran bir Boole ifadesi olmalıdır.not_matched_by_source_action
DELETE
Hedef tablo satırını siler.
UPDATE
Hedef tablo satırını Güncelleştirmeler.
expr
yalnızca hedef tablodaki sütunlara başvurabilir, aksi takdirde sorgu bir çözümleme hatası oluşturur.Şunlar için geçerlidir: Databricks SQL Databricks Runtime 11.3 LTS ve üzeri
Sütunu varsayılan değerine açıkça güncelleştirmek için olarak
expr
belirtebilirsinizDEFAULT
.
Önemli
false olarak değerlendirildiğinde
merge_condition
hedef satırları güncelleştirmek veya silmek için birWHEN NOT MATCHED BY SOURCE
yan tümce eklemek, çok sayıda hedef satırın değiştirilmesine neden olabilir. En iyi performans için güncelleştirilen veya silinen hedef satır sayısını sınırlamak için s uygulayınnot_matched_by_source_condition
.Birden çok
WHEN NOT MATCHED BY SOURCE clauses
varsa, bunlar belirtildikleri sırayla değerlendirilir. Son yan tümcesi dışında herWHEN NOT MATCHED BY SOURCE
yan tümcenin birnot_matched_by_source_condition
olması gerekir. Aksi takdirde, sorgu bir NON_LAST_NOT_MATCHED_BY_SOURCE_CLAUSE_OMIT_CONDITION hatası döndürür.Kaynak tablodaki
WHEN NOT MATCHED BY SOURCE
herhangi bir satıra bağlı olarakmerge_condition
eşleşmeyen bir hedef satır için koşulların hiçbiri doğru olarak değerlendirilmezse, hedef satır değiştirilmeden bırakılır.
Önemli
MERGE
Kaynak veri kümesinin birden çok satırı eşleşirse ve hedef Delta tablosunun aynı satırlarını güncelleştirmeye çalışırsa bir işlem DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE hatasıyla başarısız olabilir. Birleştirmenin SQL semantiğine göre, eşleşen hedef satırı güncelleştirmek için hangi kaynak satırın kullanılacağı belirsiz olduğundan bu tür bir güncelleştirme işlemi belirsizdir. Birden çok eşleşme olasılığını ortadan kaldırmak için kaynak tabloyu önceden işleyebilirsiniz. Değişiklik veri yakalama örneğine bakın; bu değişiklik hedef Delta tablosuna uygulanmadan önce her anahtar için yalnızca en son değişikliği korumak için değişiklik veri kümesini (kaynak veri kümesi) önceden işler.
Örnekler
Verileri yinelenenleri kaldırma, değişiklik verilerini artırma, SCD Tür 2 işlemlerini uygulama gibi karmaşık işlemler için kullanabilirsiniz MERGE INTO
. Birkaç örnek için bkz . Birleştirmeyi kullanarak Delta Lake tablosuna upsert ekleme.
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