MERGE INTO

Şunlar için geçerlidir:check marked yes Databricks SQL check marked yes 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

  • target_table_name

    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.

  • target_alias

    Hedef tablo için tablo diğer adı. Diğer ad bir sütun listesi içermemelidir.

  • source_table_reference

    Hedef tabloyla birleştirilecek kaynak tabloyu tanımlayan tablo adı.

  • source_alias

    Kaynak tablo için tablo diğer adı. Diğer ad bir sütun listesi içermemelidir.

  • ON merge_condition

    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 MATCHEDyan tümceleri, bir kaynak satır ve isteğe bağlı match_conditiontemelinde bir hedef tablo satırıyla merge_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ğerdir UPDATE 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:check marked yes Databricks SQL SQL ambarı sürüm 2022.35 veya üzeri check marked yes Databricks Runtime 11.2 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 her WHEN MATCHED yan tümcenin bir matched_conditionolması 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şen merge_conditionbir 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 MATCHEDyan tümceleri, bir kaynak satır ve isteğe bağlı not_matched_conditiontemelinde merge_condition herhangi bir hedef satırla eşleşmediğinde bir satır ekler.

    Şunlar için geçerlidir:check marked yes Databricks SQL check marked yes Databricks Runtime 12.1 ve üzeri

    WHEN NOT MATCHED BY TARGET için WHEN NOT MATCHEDdiğ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:check marked yes Databricks SQL SQL ambarı sürüm 2022.35 veya üzeri check marked yes Databricks Runtime 11.2 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üm WHEN NOT MATCHED yan tümcelerde s olmalıdır not_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:check marked yes Databricks SQL check marked yes Databricks Runtime 12.1 ve üzeri

    WHEN NOT MATCHED BY SOURCE yan tümceleri, hedef satır temel alınarak merge_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:check marked yes Databricks SQL SQL ambarı sürüm 2022.35 veya üzeri check marked yes Databricks Runtime 11.2 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 bir WHEN 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ın not_matched_by_source_condition.

    Birden çok WHEN NOT MATCHED BY SOURCE clausesvarsa, bunlar belirtildikleri sırayla değerlendirilir. Son yan tümcesi dışında her WHEN NOT MATCHED BY SOURCE yan tümcenin bir not_matched_by_source_conditionolması 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ı olarak merge_conditioneş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