BERGABUNG MENJADI
Berlaku untuk: Databricks SQL 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
-
Nama Tabel yang mengidentifikasi tabel yang sedang dimodifikasi. Tabel yang dirujuk harus tabel Delta.
Tabel tidak boleh tabel asing.
-
Tabel Alias untuk tabel target. Alias tidak boleh menyertakan daftar kolom.
-
Nama Tabel yang mengidentifikasi tabel sumber yang akan digabungkan ke dalam tabel target.
-
Tabel Alias untuk tabel sumber. Alias tidak boleh menyertakan daftar kolom.
-
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 berdasarkanmerge_condition
danmatch_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 denganUPDATE 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: Databricks SQL Databricks Runtime 11.3 LTS ke atas
Anda dapat menentukan
DEFAULT
untukexpr
memperbarui kolom secara eksplisit ke nilai defaultnya.
Jika ada beberapa klausul
WHEN MATCHED
, klausul tersebut dievaluasi sesuai urutan yang telah ditentukan. Setiap klausulWHEN MATCHED
, kecuali yang terakhir, harus memilikimatched_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 denganmerge_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 berdasarkanmerge_condition
dannot_matched_condition
opsional.Berlaku untuk: Databricks SQL Databricks Runtime 12.2 LTS ke atas
WHEN NOT MATCHED BY TARGET
dapat digunakan sebagai alias untukWHEN 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: Databricks SQL 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 klausulWHEN NOT MATCHED
, kecuali yang terakhir, harus memilikinot_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: Databricks SQL 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 berdasarkanmerge_condition
dan evaluasi opsionalnot_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: Databricks SQL Databricks Runtime 11.3 LTS ke atas
Anda dapat menentukan
DEFAULT
untukexpr
memperbarui kolom secara eksplisit ke nilai defaultnya.
Penting
WHEN NOT MATCHED BY SOURCE
Menambahkan klausul untuk memperbarui atau menghapus baris target saatmerge_condition
evaluasi ke false dapat menyebabkan sejumlah besar baris target dimodifikasi. Untuk performa terbaik, terapkannot_matched_by_source_condition
s 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 klausulWHEN NOT MATCHED BY SOURCE
, kecuali yang terakhir, harus memilikinot_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 berdasarkanmerge_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