BERGABUNG MENJADI

Berlaku untuk:centang ditandai ya Databricks SQL centang ditandai ya Databricks Runtime

Menggabungkan serangkaian pembaruan, penyisipan, dan penghapusan berdasarkan tabel sumber ke dalam tabel Delta target.

Pernyataan ini hanya didukung untuk tabel Delta Lake.

Halaman ini berisi detail untuk menggunakan sintaks yang benar dengan MERGE perintah . Lihat Upsert ke dalam tabel Delta Lake menggunakan penggabungan untuk panduan selengkapnya tentang cara menggunakan MERGE operasi untuk mengelola data Anda.

Sintaks

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 } } [, ...] }

Parameter

  • target_table_name

    Nama Tabel yang mengidentifikasi tabel yang sedang dimodifikasi. Tabel yang dirujuk harus tabel Delta.

    Tabel tidak boleh tabel asing.

  • target_alias

    Tabel Alias untuk tabel target. Alias tidak boleh menyertakan daftar kolom.

  • source_table_reference

    Nama Tabel yang mengidentifikasi tabel sumber yang akan digabungkan ke dalam tabel target.

  • source_alias

    Tabel Alias untuk tabel sumber. Alias tidak boleh menyertakan daftar kolom.

  • ON merge_condition

    Bagaimana baris dari satu relasi digabungkan dengan baris relasi lain. Ekspresi dengan jenis BOOLEAN kembali.

  • WHEN MATCHED [ AND matched_condition]

    Klausul WHEN MATCHED dijalankan saat baris sumber cocok dengan baris tabel target berdasarkan merge_condition dan match_condition opsional.

  • matched_action

    • DELETE

      Menghapus baris tabel target yang cocok.

      Beberapa kecocokan diizinkan saat kecocokan dihapus tanpa syarat. Penghapusan tanpa syarat tidak ambigu, meskipun ada beberapa kecocokan.

    • UPDATE

      Memperbarui baris tabel target yang cocok.

      Untuk memperbarui semua kolom tabel Delta target dengan kolom yang sesuai dari himpunan data sumber, gunakan UPDATE SET *. Ini setara dengan UPDATE SET col1 = source.col1 [, col2 = source.col2 ...] untuk semua kolom tabel Delta target. Oleh karena itu, tindakan ini mengasumsikan bahwa tabel sumber memiliki kolom yang sama dengan yang ada di tabel target, jika tidak kueri akan melemparkan kesalahan analisis.

      Catatan

      Perilaku ini berubah saat migrasi skema otomatis diaktifkan. Lihat Evolusi skema otomatis untuk penggabungan Delta Lake untuk detailnya.

      Berlaku untuk:centang ditandai ya Databricks SQL centang ditandai ya Databricks Runtime 11.3 LTS ke atas

      Anda dapat menentukan DEFAULT untuk expr memperbarui kolom secara eksplisit ke nilai defaultnya.

    Jika ada beberapa klausul WHEN MATCHED, klausul tersebut dievaluasi sesuai urutan yang telah ditentukan. Setiap klausul WHEN MATCHED, kecuali yang terakhir, harus memiliki matched_condition. Jika tidak, kueri mengembalikan kesalahan NON_LAST_MATCHED_CLAUSE_OMIT_CONDITION .

    Jika tidak ada kondisi WHEN MATCHED yang bernilai benar untuk pasangan baris sumber dan target yang cocok dengan merge_condition, maka baris target tidak akan berubah.

  • WHEN NOT MATCHED [BY TARGET] [ AND not_matched_condition]

    Klausul WHEN NOT MATCHED menyisipkan baris saat baris sumber tidak cocok dengan baris target apa pun berdasarkan merge_condition dan not_matched_condition opsional.

    Berlaku untuk:centang ditandai ya Databricks SQL centang ditandai ya Databricks Runtime 12.2 LTS ke atas

    WHEN NOT MATCHED BY TARGET dapat digunakan sebagai alias untuk WHEN NOT MATCHED.

    not_matched_condition harus berupa ekspresi Boolean.

    • INSERT *

      Menyisipkan semua kolom tabel Delta target dengan kolom yang sesuai dari kumpulan data sumber. Ini setara dengan INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...]) untuk semua kolom tabel Delta target. Tindakan ini mengharuskan tabel sumber memiliki kolom yang sama dengan yang ada di tabel target.

      Catatan

      Perilaku ini berubah saat migrasi skema otomatis diaktifkan. Lihat Evolusi skema otomatis untuk penggabungan Delta Lake untuk detailnya.

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

      Baris baru dihasilkan berdasarkan kolom yang ditentukan dan ekspresi yang sesuai. Semua kolom dalam tabel target tidak perlu ditentukan. Untuk kolom target yang tidak ditentukan, default kolom disisipkan, atau NULL jika tidak ada.

      Berlaku untuk:centang ditandai ya Databricks SQL centang ditandai ya Databricks Runtime 11.3 LTS ke atas

      Anda dapat menentukan DEFAULT sebagai ekspresi untuk secara eksplisit menyisipkan kolom default untuk kolom target.

    Jika ada beberapa klausul WHEN NOT MATCHED, klausul tersebut dievaluasi sesuai urutan yang telah ditentukan. Semua klausul WHEN NOT MATCHED, kecuali yang terakhir, harus memiliki not_matched_condition. Jika tidak, kueri mengembalikan kesalahan NON_LAST_NOT_MATCHED_CLAUSE_OMIT_CONDITION .

  • WHEN NOT MATCHED BY SOURCE [ AND not_matched_by_source_condition]

    Berlaku untuk:centang ditandai ya Databricks SQL centang ditandai ya Databricks Runtime 12.2 LTS ke atas

    WHEN NOT MATCHED BY SOURCE klausa dijalankan ketika baris target tidak cocok dengan baris apa pun dalam tabel sumber berdasarkan merge_condition dan evaluasi opsional not_match_by_source_condition ke true.

    not_matched_by_source_condition harus berupa ekspresi Boolean yang hanya mereferensikan kolom dari tabel target.

  • not_matched_by_source_action

    • DELETE

      Menghapus baris tabel target.

    • UPDATE

      Memperbarui baris tabel target. expr hanya dapat mereferensikan kolom dari tabel target, jika tidak, kueri akan melemparkan kesalahan analisis.

      Berlaku untuk:centang ditandai ya Databricks SQL centang ditandai ya Databricks Runtime 11.3 LTS ke atas

      Anda dapat menentukan DEFAULT untuk expr memperbarui kolom secara eksplisit ke nilai defaultnya.

    Penting

    WHEN NOT MATCHED BY SOURCE Menambahkan klausul untuk memperbarui atau menghapus baris target saat merge_condition evaluasi ke false dapat menyebabkan sejumlah besar baris target dimodifikasi. Untuk performa terbaik, terapkan not_matched_by_source_conditions untuk membatasi jumlah baris target yang diperbarui atau dihapus.

    Jika ada beberapa WHEN NOT MATCHED BY SOURCE clauses, maka mereka dievaluasi dalam urutan yang ditentukan. Setiap klausul WHEN NOT MATCHED BY SOURCE, kecuali yang terakhir, harus memiliki not_matched_by_source_condition. Jika tidak, kueri mengembalikan kesalahan NON_LAST_NOT_MATCHED_BY_SOURCE_CLAUSE_OMIT_CONDITION .

    Jika tidak ada kondisi yang WHEN NOT MATCHED BY SOURCE dievaluasi ke true untuk baris target yang tidak cocok dengan baris apa pun dalam tabel sumber berdasarkan merge_condition, maka baris target dibiarkan tidak berubah.

Penting

MERGE Operasi dapat gagal dengan kesalahan DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE jika beberapa baris himpunan data sumber cocok dan mencoba memperbarui baris tabel Delta target yang sama. Menurut semantik SQL penggabungan, operasi pembaruan semacam itu ambigu karena tidak jelas baris sumber mana yang harus digunakan untuk memperbarui baris target yang cocok. Anda dapat memproses tabel sumber terlebih dahulu untuk menghilangkan kemungkinan beberapa kecocokan. Lihat Ubah contoh pengambilan data—ini telah menyiapkan himpunan data perubahan (yaitu, himpunan data sumber) untuk mempertahankan hanya perubahan terbaru untuk setiap kunci sebelum menerapkan perubahan tersebut ke tabel Delta target.

Contoh

Anda dapat menggunakan MERGE INTO untuk operasi kompleks seperti mendeduplikasi data, meningkatkan data perubahan, menerapkan operasi SCD Tipe 2, dll. Lihat Upsert ke dalam tabel Delta Lake menggunakan penggabungan untuk beberapa contoh.

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