Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
MERGE
Secara kondisional menggabungkan baris dari tabel sumber ke dalam tabel target. Secara tradisional, ini hanya dapat dicapai dengan menggunakan beberapa pernyataan sisipan, pembaruan, atau hapus secara terpisah. Untuk informasi selengkapnya tentang operasi yang MERGE memungkinkan Anda menggabungkan UPDATE, lihat DELETE, dan INSERT.
Sintaks
MERGE INTO target_table USING source_table [ [ AS ] alias ] ON match_condition [ WHEN MATCHED THEN { UPDATE SET col_name = { expr } [,...] | DELETE } WHEN NOT MATCHED THEN INSERT [ ( col_name [,...] ) ] VALUES ( { expr } [, ...] ) | REMOVE DUPLICATES ]
Parameter
- target_table
-
Tabel sementara atau permanen tempat MERGE pernyataan digabungkan.
- source_table
-
Tabel sementara atau permanen yang memasok baris untuk digabungkan menjadi target_table. source_table juga bisa menjadi tabel Spectrum.
- alias
-
Nama alternatif sementara untuk source_table.
Parameter ini bersifat opsional. Alias sebelumnya dengan AS juga opsional.
- match_condition
-
Menentukan predikat yang sama antara kolom tabel sumber dan kolom tabel target yang digunakan untuk menentukan apakah baris di source_table dapat dicocokkan dengan baris di target_table. Jika kondisi terpenuhi, MERGE jalankan matched_clause untuk baris itu. Jika tidak, MERGE jalankan not_matched_clause untuk baris itu.
- WHEN MATCHED
-
Menentukan tindakan yang akan dijalankan ketika kondisi kecocokan antara baris sumber dan baris target mengevaluasi ke True. Anda dapat menentukan UPDATE tindakan atau DELETE tindakan.
- UPDATE
Memperbarui baris yang cocok di target_table. Hanya nilai dalam col_name yang Anda tentukan yang diperbarui.
- DELETE
Menghapus baris yang cocok di target_table.
- WHEN NOT MATCHED
-
Menentukan tindakan yang akan dijalankan ketika kondisi kecocokan dievaluasi ke False atau Unknown. Anda hanya dapat menentukan tindakan INSERT penyisipan untuk klausa ini.
- INSERT
Menyisipkan ke dalam baris target_table dari source_table yang tidak cocok dengan baris apa pun di target_table, menurut match_condition. Col_name target dapat dicantumkan dalam urutan apa pun. Jika Anda tidak memberikan nilai col_name, urutan default adalah semua kolom tabel dalam urutan yang dideklarasikan.
- col_name
-
Satu atau beberapa nama kolom yang ingin Anda ubah. Jangan sertakan nama tabel saat menentukan kolom target.
- expr
-
Ekspresi mendefinisikan nilai baru untuk col_name.
- REMOVE DUPLICATES
-
Menentukan bahwa MERGE perintah berjalan dalam modus disederhanakan. Mode yang disederhanakan memiliki persyaratan sebagai berikut:
target_table dan source_table harus memiliki jumlah kolom yang sama dan jenis kolom yang kompatibel.
WHENHilangkan klausa dan klausa UPDATE dan dari INSERT perintah Anda. MERGE
Gunakan REMOVE DUPLICATES klausa dalam MERGE perintah Anda.
Dalam mode yang disederhanakan, MERGE lakukan hal berikut:
Baris di target_table yang memiliki kecocokan di source_table diperbarui agar sesuai dengan nilai di source_table.
Baris di source_table yang tidak memiliki kecocokan di target_table disisipkan ke target_table.
Ketika beberapa baris di target_table cocok dengan baris yang sama di source_table, baris duplikat akan dihapus. Amazon Redshift menyimpan satu baris dan memperbaruinya. Baris duplikat yang tidak cocok dengan baris di source_table tetap tidak berubah.
Menggunakan REMOVE DUPLICATES memberikan kinerja yang lebih baik daripada menggunakan WHEN MATCHED dan WHEN NOTMATCHED. Sebaiknya gunakan REMOVE DUPLICATES jika target_table dan source_table kompatibel dan Anda tidak perlu mempertahankan baris duplikat di target_table.
Catatan penggunaan
-
Untuk menjalankan MERGE pernyataan, Anda harus menjadi pemilik source_table dan target_table, atau memiliki izin untuk tabel tersebutSELECT. Selain itu, Anda harus memilikiUPDATE,DELETE, dan INSERT izin untuk target_table tergantung pada operasi yang disertakan dalam pernyataan Anda. MERGE
-
target_table tidak bisa berupa tabel sistem, tabel katalog, atau tabel eksternal.
-
source_table dan target_table tidak bisa menjadi tabel yang sama.
-
Anda tidak dapat menggunakan WITH klausa dalam MERGE pernyataan.
-
Baris di target_table tidak dapat mencocokkan beberapa baris di source_table.
Pertimbangkan contoh berikut:
CREATE TABLE target (id INT, name CHAR(10)); CREATE TABLE source (id INT, name CHAR(10)); INSERT INTO target VALUES (1, 'Bob'), (2, 'John'); INSERT INTO source VALUES (1, 'Tony'), (1, 'Alice'), (3, 'Bill'); MERGE INTO target USING source ON target.id = source.id WHEN MATCHED THEN UPDATE SET id = source.id, name = source.name WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name); ERROR: Found multiple matches to update the same tuple. MERGE INTO target USING source ON target.id = source.id WHEN MATCHED THEN DELETE WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name); ERROR: Found multiple matches to update the same tuple.
Dalam kedua MERGE pernyataan, operasi gagal karena ada beberapa baris dalam
source
tabel dengan nilai ID1
. -
match_condition dan expr tidak dapat mereferensikan sebagian kolom tipe. SUPER Misalnya, jika objek SUPER tipe Anda adalah array atau struktur, Anda tidak dapat menggunakan elemen individual dari kolom tersebut untuk match_condition atau expr, tetapi Anda dapat menggunakan seluruh kolom.
Pertimbangkan contoh berikut:
CREATE TABLE IF NOT EXISTS target (key INT, value SUPER); CREATE TABLE IF NOT EXISTS source (key INT, value SUPER); INSERT INTO target VALUES (1, JSON_PARSE('{"key": 88}')); INSERT INTO source VALUES (1, ARRAY(1, 'John')), (2, ARRAY(2, 'Bill')); MERGE INTO target USING source ON target.key = source.key WHEN matched THEN UPDATE SET value = source.value[0] WHEN NOT matched THEN INSERT VALUES (source.key, source.value[0]); ERROR: Partial reference of SUPER column is not supported in MERGE statement.
Untuk informasi selengkapnya tentang SUPER jenisnya, lihat SUPERmengetik.
-
Jika source_table berukuran besar, mendefinisikan kolom gabungan dari target_table dan source_table sebagai kunci distribusi dapat meningkatkan kinerja.
-
Untuk menggunakan REMOVE DUPLICATES klausa, Anda perlu, SELECTINSERT, dan DELETE izin untuk target_table.
-
source_table dapat berupa tampilan atau subquery. Berikut ini adalah contoh MERGE pernyataan di mana source_table adalah subquery yang menghapus baris duplikat.
MERGE INTO target USING (SELECT id, name FROM source GROUP BY 1, 2) as my_source ON target.id = my_source.id WHEN MATCHED THEN UPDATE SET id = my_source.id, name = my_source.name WHEN NOT MATCHED THEN INSERT VALUES (my_source.id, my_source.name);
Contoh
Contoh berikut membuat dua tabel, kemudian menjalankan MERGE operasi pada mereka, memperbarui baris yang cocok dalam tabel target dan memasukkan baris yang tidak cocok. Kemudian menyisipkan nilai lain ke dalam tabel sumber dan menjalankan MERGE operasi lain, kali ini menghapus baris yang cocok dan memasukkan baris baru dari tabel sumber.
Pertama buat dan isi tabel sumber dan target.
CREATE TABLE target (id INT, name CHAR(10)); CREATE TABLE source (id INT, name CHAR(10)); INSERT INTO target VALUES (101, 'Bob'), (102, 'John'), (103, 'Susan'); INSERT INTO source VALUES (102, 'Tony'), (103, 'Alice'), (104, 'Bill'); SELECT * FROM target; id | name -----+------------ 101 | Bob 102 | John 103 | Susan (3 rows) SELECT * FROM source; id | name -----+------------ 102 | Tony 103 | Alice 104 | Bill (3 rows)
Selanjutnya, gabungkan tabel sumber ke dalam tabel target, perbarui tabel target dengan baris yang cocok dan masukkan baris dari tabel sumber yang tidak cocok.
MERGE INTO target USING source ON target.id = source.id WHEN MATCHED THEN UPDATE SET id = source.id, name = source.name WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name); SELECT * FROM target; id | name -----+------------ 101 | Bob 102 | Tony 103 | Alice 104 | Bill (4 rows)
Perhatikan bahwa baris dengan nilai id 102 dan 103 diperbarui agar sesuai dengan nilai nama dari tabel target. Juga, baris baru dengan nilai id 104 dan nilai nama Bill dimasukkan ke dalam tabel target.
Selanjutnya, masukkan baris baru ke dalam tabel sumber.
INSERT INTO source VALUES (105, 'David'); SELECT * FROM source; id | name -----+------------ 102 | Tony 103 | Alice 104 | Bill 105 | David (4 rows)
Terakhir, jalankan operasi gabungan menghapus baris yang cocok di tabel target, dan menyisipkan baris yang tidak cocok.
MERGE INTO target USING source ON target.id = source.id WHEN MATCHED THEN DELETE WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name); SELECT * FROM target; id | name -----+------------ 101 | Bob 105 | David (2 rows)
Baris dengan nilai id 102, 103, dan 104 dihapus dari tabel target, dan baris baru dengan nilai id 105 dan nilai nama David dimasukkan ke dalam tabel target.
Contoh berikut menunjukkan sintaks sederhana dari MERGE perintah yang menggunakan REMOVE DUPLICATES klausa.
CREATE TABLE target (id INT, name CHAR(10)); CREATE TABLE source (id INT, name CHAR(10)); INSERT INTO target VALUES (30, 'Tony'), (11, 'Alice'), (23, 'Bill'); INSERT INTO source VALUES (23, 'David'), (22, 'Clarence'); MERGE INTO target USING source ON target.id = source.id REMOVE DUPLICATES; SELECT * FROM target; id | name ---+------------ 30 | Tony 11 | Alice 23 | David 22 | Clarence (4 rows)
Contoh berikut menunjukkan sintaks sederhana dari MERGE perintah yang menggunakan REMOVE DUPLICATES klausa, menghapus baris duplikat dari target_table jika mereka memiliki baris yang cocok di source_table.
CREATE TABLE target (id INT, name CHAR(10)); CREATE TABLE source (id INT, name CHAR(10)); INSERT INTO target VALUES (30, 'Tony'), (30, 'Daisy'), (11, 'Alice'), (23, 'Bill'), (23, 'Nikki'); INSERT INTO source VALUES (23, 'David'), (22, 'Clarence'); MERGE INTO target USING source ON target.id = source.id REMOVE DUPLICATES; SELECT * FROM target; id | name ---+------------ 30 | Tony 30 | Daisy 11 | Alice 23 | David 22 | Clarence (5 rows)
Setelah MERGE berjalan, hanya ada satu baris dengan nilai ID 23 di target_table. Karena tidak ada baris di source_table dengan nilai ID 30, dua baris duplikat dengan nilai ID 30 tetap berada di target_table.