MERGE INTO

Şunlar için geçerlidir:onay işareti evet olarak işaretlenmiş Databricks SQL onay işareti evet olarak işaretlenmiş 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, MERGE komutuyla doğru sözdizimini kullanma ayrıntılarını içerir. Daha fazla bilgi için, Delta Lake tablosuna birleştirme kullanarak upsert yapma rehberine bakın ve verilerinizi yönetmek için MERGE işlemlerinden nasıl yararlanacağınızı öğrenin.

Sözdizimi

[ common_table_expression ]
  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 * [ EXCEPT ( column [, ...] ) ] |
   UPDATE SET { column = { expr | DEFAULT } } [, ...] }

not_matched_action
 { INSERT * [ EXCEPT ( column [, ...] ) ] |
   INSERT (column1 [, ...] ) VALUES ( expr | DEFAULT ] [, ...] )

not_matched_by_source_action
 { DELETE |
   UPDATE SET { column = { expr | DEFAULT } } [, ...] }

Parametreler

  • ortak tablo ifadesi

    Yaygın tablo ifadeleri (CTE), yinelenen hesaplamaları önlemek veya karmaşık, iç içe sorguların okunabilirliğini geliştirmek için ana sorgu bloğu içinde birden çok kez yeniden kullanılabilen bir veya daha fazla adlandırılmış sorgudur.

  • WITH SCHEMA EVOLUTION

    Şunun için geçerlidir:evet olarak işaretlendi Databricks Runtime 15.2 veya üzerini denetleyin

    Bu işlemi için MERGE etkinleştirir. Etkinleştirildiğinde hedef Delta tablosunun şeması, kaynak tablonun şemasıyla eşleşecek şekilde otomatik olarak güncelleştirilir.

  • target_table_name

    Değiştirilen tabloyu tanımlayan Tablo adı. Başvurabileceğiniz tablo bir Delta tablosu olmalıdır.

    Ad bir seçenek belirtimi içermemelidir.

    Tablonun yabancı bir tablo olmaması gerekir.

  • target_alias

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

  • kaynak_tablo_referansı

    Tablo adı, hedef tabloyla birleştirilecek olan kaynak tabloyu tanımlar.

  • kaynak_takma_adı

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

  • ON birleşim_koşulu

    Bir ilişkideki satırların başka bir ilişkinin satırlarıyla nasıl birleştirildiği. Boole dönüş türüne sahip bir ifade.

  • WHEN MATCHED [ AND eşleşen_koşul]

    WHEN MATCHED yan tümceleri, kaynak satır, merge_condition ve isteğe bağlı match_condition temelinde bir hedef tablo satırıyla eşleştiğinde yürütülür.

  • eşleşmiş_eylem

    • DELETE

      Eşleşen hedef tablo satırını siler.

      Databricks, eşleşmeler koşulsuz olarak silindiğinde birden çok eşleşmeye izin verir. 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ştirir.

      Hedef Delta tablosunun tüm sütunlarını kaynak veri kümesinin ilgili sütunlarıyla güncelleştirmek için UPDATE SET *kullanın. Bu, hedef Delta tablosunun tüm sütunları için UPDATE SET col1 = source.col1 [, col2 = source.col2 ...] eşdeğerdir. Bu nedenle, bu eylem kaynak tablonun hedef tablodakilerle aynı sütunlara sahip olduğunu varsayar; aksi takdirde sorgu bir analiz hatası oluşturur.

      Şunun için geçerlidir:evet olarak işaretlendi Databricks SQL denetimi evet olarak işaretlendi Databricks Runtime 12.2 LTS veya üzeri

      Belirli sütunları öğesinin dışında UPDATE SET *tutmak için yan tümcesini EXCEPT kullanın. Dışlanan hedef sütunlar olarak nullayarlanır. Şema evrimi etkinleştirildiğinde, EXCEPT sütunlar kaynak sütunlara başvurur ve şema evriminin dışında tutulur. Ayrıntılar için bkz. Birleştirme ile sütunları dışlama .

      Not

      Otomatik şema evrimi etkinleştirildiğinde bu davranış değişir. Ayrıntılar için bkz. Birleştirme için otomatik şema evrimi .

      Şunun için geçerlidir:evet olarak işaretlendi Databricks SQL denetimi evet olarak işaretlendi Databricks Runtime 11.3 LTS veya üzeri

      Sütunu varsayılan değerine açıkça güncelleştirmek için DEFAULTexpr olarak belirtebilirsiniz.

    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.

    Eğer hiçbir WHEN MATCHED koşulu merge_condition eşleşen kaynak ve hedef satır çiftleri için doğru olarak değerlendirilmezse, hedef satır değişmeden bırakılır.

  • WHEN NOT MATCHED [BY TARGET] [ AND eşleşmeyen_koşul]

    WHEN NOT MATCHED yan tümceleri, kaynak satır merge_condition ve isteğe bağlı not_matched_conditiontemelinde herhangi bir hedef satırla eşleşmediğinde, bir satır ekler.

    Şunun için geçerlidir:evet olarak işaretlendi Databricks SQL denetimi evet olarak işaretlendi Databricks Runtime 12.2 LTS veya ü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 INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...]) eşdeğerdir. Bu eylem, kaynak tablonun hedef tablodaki sütunlarla aynı sütunlara sahip olmasını gerektirir.

      Şunun için geçerlidir:evet olarak işaretlendi Databricks SQL denetimi evet olarak işaretlendi Databricks Runtime 12.2 LTS veya üzeri

      Belirli sütunları öğesinin dışında INSERT *tutmak için yan tümcesini EXCEPT kullanın. Dışlanan hedef sütunlar olarak nullayarlanır. Şema evrimi etkinleştirildiğinde, EXCEPT sütunlar kaynak sütunlara başvurur ve şema evriminin dışında tutulur. Ayrıntılar için bkz. Birleştirme ile sütunları dışlama .

      Not

      Otomatik şema evrimi etkinleştirildiğinde bu davranış değişir. Ayrıntılar için bkz. Birleştirme için otomatik şema evrimi .

    • INSERT ( ... ) VALUES ( ... )

      Databricks, belirtilen sütunu ve karşılık gelen ifadeleri temel alarak yeni satırı oluşturur. Hedef tablodaki tüm sütunları belirtmeniz gerekmez. Belirtilmemiş hedef sütunlar için varsayılan sütun değeri eklenir veya yoksa NULL eklenir.

      Şunun için geçerlidir:evet olarak işaretlendi Databricks SQL denetimi evet olarak işaretlendi Databricks Runtime 11.3 LTS veya üzeri

      hedef sütun için varsayılan sütunu açıkça eklemek için DEFAULT ifade olarak belirtebilirsiniz.

    Birden çok WHEN NOT MATCHED yan tümce varsa, bunlar belirtildikleri sırayla değerlendirilir. Sonuncu yan tümce dışında tüm WHEN NOT MATCHED yan tümceler not_matched_condition içermelidir. Aksi takdirde, sorgu bir NON_LAST_NOT_MATCHED_CLAUSE_OMIT_CONDITION hatası döndürür.

  • WHEN NOT MATCHED BY SOURCE [ AND kaynak_koşulu_tarafından_uyuşmayan]

    Şunun için geçerlidir:evet olarak işaretlendi Databricks SQL denetimi evet olarak işaretlendi Databricks Runtime 12.2 LTS veya üzeri

    WHEN NOT MATCHED BY SOURCE yan tümceleri, hedef satırın merge_condition temelinde kaynak tablodaki hiçbir satırla eşleşmemesi ve isteğe bağlı not_match_by_source_condition'nin doğru (true) olarak değerlendirilmesi durumunda yürütülür.

    not_matched_by_source_condition yalnızca hedef tablodaki sütunlara başvuran bir Boole ifadesi olmalıdır.

  • kaynak_eylemiyle_eşleşmedi

    • DELETE

      Hedef tablo satırını siler.

    • UPDATE

      Hedef tablo satırını güncelleştirir. expr yalnızca hedef tablodaki sütunlara başvurabilir, aksi takdirde sorgu bir çözümleme hatası oluşturur.

      Şunun için geçerlidir:evet olarak işaretlendi Databricks SQL denetimi evet olarak işaretlendi Databricks Runtime 11.3 LTS veya üzeri

      Sütunu varsayılan değerine açıkça güncelleştirmek için DEFAULTexpr olarak belirtebilirsiniz.

    Önemli

    WHEN NOT MATCHED BY SOURCE false olarak değerlendirildiğinde hedef satırları güncelleştirmek veya silmek için bir merge_condition yan tümcesi 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 not_matched_by_source_conditionuygulayın.

    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.

    Hedef satır, kaynak tablodaki satırlardan herhangi biriyle WHEN NOT MATCHED BY SOURCE eşleşmezse ve merge_condition koşullarının hiçbiri doğru olarak değerlendirilmezse, bu hedef satır değiştirilmeden bırakılır.

Önemli

kaynak tablodaki birden fazla satır, MERGE ve yan tümcelerinde belirtilen koşullara göre hedef tablodaki aynı satırla eşleşiyorsa ON işlemleri WHEN MATCHED hatasıyla başarısız olur. 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 güncelleştirme işlemi belirsizdir. Birden çok eşleşme olasılığını ortadan kaldırmak için kaynak tabloyu önceden işleyebilirsiniz. Veri yakalamayı değiştirme örneğine bakın. Bu örnek, değişiklik veri kümesini (kaynak veri kümesi) önceden işleyerek bu değişikliği hedef Delta tablosuna uygulamadan önce her anahtar için yalnızca en son değişikliği korur. Databricks Runtime 15.4 LTS ve altında, MERGE birden çok eşleşmeyi değerlendirmeden önce yalnızca yan tümcesindeki ON koşulları dikkate alır.

Örnekler

Karmaşık işlemler için, örneğin verileri yinelenenleri kaldırma, değişiklik verilerini güncelleme ve ekleme, SCD Tür 2 işlemlerini uygulama gibi, kullanabilirsiniz. Birkaç örnek için kullanarak Delta Lake tablosuna birleştirme ile upsert yapma ’e bakın.

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)

-- Insert all columns from the source except `last_updated`, which is set to null in the target.
> MERGE INTO target USING source
  ON target.key = source.key
  WHEN NOT MATCHED THEN INSERT * EXCEPT (last_updated)

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