

 Amazon Redshift tidak akan lagi mendukung penggunaan Python UDF setelah 30 Juni 2026. Kami akan mulai menegakkannya secara bertahap. Untuk informasi lebih lanjut tentang detail opsi akhir masa pakai dan migrasi Python, lihat posting [ blog ](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/) yang diterbitkan pada 30 Juni 2025. 

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# MERGE
<a name="r_MERGE"></a>

Secara kondisional menggabungkan baris dari tabel sumber ke tabel target. Secara tradisional, ini hanya dapat dicapai dengan menggunakan beberapa pernyataan menyisipkan, memperbarui atau menghapus secara terpisah. Untuk informasi selengkapnya tentang operasi yang memungkinkan Anda menggabungkan MERGE, lihat UP [ DATE](https://docs.aws.amazon.com/redshift/latest/dg/r_UPDATE.html), DEL [ ETE](https://docs.aws.amazon.com/redshift/latest/dg/r_DELETE.html), dan IN [ SERT](https://docs.aws.amazon.com/redshift/latest/dg/r_INSERT_30.html).

## Sintaksis
<a name="r_MERGE-synopsis"></a>

```
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
<a name="r_MERGE-parameters"></a>

 *tabel\_target *  
Tabel sementara atau permanen yang digabungkan dengan pernyataan MERGE.

 *tabel\_sumber *  
Tabel sementara atau permanen menyediakan 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.

 *kondisi kecocokan *  
Menentukan predikat yang sama antara kolom tabel sumber dan kolom tabel target yang digunakan untuk menentukan apakah baris di * source\_table dapat dicocok * kan dengan baris di target\_table. * * Jika kondisi terpenuhi, MERGE menjalankan * matched\_clauze * untuk baris tersebut. Jika tidak, MERGE menjalankan * not\_matched\_clauze untuk baris itu*.

SAAT DICOCOKKAN  
 Menentukan tindakan yang akan dijalankan ketika kondisi kecocokan antara baris sumber dan baris target dievaluasi menjadi True. Anda dapat menentukan tindakan UPDATE atau DELETE. 

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. 

KETIKA TIDAK COCOK  
 Menentukan tindakan yang akan dijalankan saat kondisi kecocokan dievaluasi ke False atau Unknown. Anda hanya dapat menentukan tindakan menyisipkan INSERT untuk klausa ini. 

INSERT  
 Menyisip * kan ke * baris target\_table dari * source\_table * yang tidak cocok dengan baris apa pun di * target * \_table, sesuai dengan match\_condition. * * Target * col\_name * dapat dicantumkan dalam urutan apa pun. Jika Anda tidak memberikan * nilai * col\_name apa pun, 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.

 *ekspr *  
Ekspresi yang mendefinisikan nilai baru untuk * col\_name*.

 MENGHAPUS DUPLIKAT  
Menentukan bahwa perintah MERGE berjalan dalam mode yang disederhanakan. Mode yang disederhanakan memiliki persyaratan sebagai berikut:  
+  *target\_table * dan * source\_table * harus memiliki jumlah kolom yang sama, jenis kolom yang kompatibel, dan urutan kolom yang sama. 
+  Hilangkan klausa WHEN dan klausa UPDATE dan INSERT dari perintah MERGE Anda. 
+  Gunakan klausa REMOVE DUPLICATES dalam perintah MERGE Anda. 
Dalam mode yang disederhanakan, MERGE melakukan 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 dimasukkan ke dalam * target\_table*. * * 
+  Ketika beberapa baris di * target\_table * cocok dengan baris yang sama di * source\_table*, baris duplikat 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 NOT MATCHED. Sebaiknya gunakan REMOVE DUPLICATES jika * target\_table * dan * source\_table * kompatibel dan Anda tidak perlu menyimpan baris duplikat di target\_table. * *

## Catatan penggunaan
<a name="r_MERGE_usage_notes"></a>
+ Untuk menjalankan pernyataan MERGE, Anda harus menjadi pemilik * source\_table * dan * target\_table*, atau memiliki izin SELECT untuk tabel tersebut. Selain itu, Anda harus memiliki izin UPDATE, DELETE, dan INSERT untuk * target\_table * tergantung pada operasi yang disertakan dalam pernyataan MERGE Anda.
+  *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 klausa WITH dalam pernyataan MERGE. 
+  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 pernyataan MERGE, operasi gagal karena ada beberapa baris dalam `source` tabel dengan nilai ID`1`.
+  *match\_condition * dan * expr tidak * dapat mereferensikan sebagian kolom tipe SUPER. Misalnya, jika objek tipe SUPER Anda adalah array atau struktur, Anda tidak dapat menggunakan elemen individual dari kolom itu 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 tipe SUPER, lihat tipe [ SUPER](https://docs.aws.amazon.com/redshift/latest/dg/r_SUPER_type.html).
+ Jika * source\_table * besar, mendefinisikan kolom gabungan dari * target\_table * dan * source\_table sebagai kunci distribusi dapat meningkatkan kinerja*.
+ Untuk menggunakan klausa REMOVE DUPLICATES, Anda memerlukan izin SELECT, INSERT, dan DELETE untuk * target * \_table.
+  *source\_table * dapat berupa tampilan atau subquery. Berikut ini adalah contoh pernyataan MERGE 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);
  ```
+ Target tidak dapat menjadi sumber data dari subkueri apa pun dari pernyataan MERGE yang sama. Misalnya, perintah SQL berikut mengembalikan  kesalahan seperti ERROR: Sumber view/subquery dalam pernyataan Merge tidak dapat mereferensikan tabel target. karena referensi subquery al `target` ih-alih`source`.

  ```
  MERGE INTO target
  USING (SELECT id, name FROM {{target}} 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
<a name="sub-examples-merge"></a>

Contoh berikut membuat dua tabel, lalu menjalankan operasi MERGE pada mereka, memperbarui baris yang cocok di tabel target dan memasukkan baris yang tidak cocok. Kemudian ia memasukkan nilai lain ke dalam tabel sumber dan menjalankan operasi MERGE 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 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 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 penggabungan menghapus baris yang cocok di tabel target, dan memasukkan 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 perintah MERGE yang menggunakan klausa REMOVE DUPLICATES.

```
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 perintah MERGE yang menggunakan klausa REMOVE DUPLICATES, 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. * *

## Lihat juga
<a name="r_MERGE-see-also"></a>

 [INSERT](r_INSERT_30.md), [UPDATE](r_UPDATE.md), [DELETE](r_DELETE.md) 