Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Contoh berikut melakukan penggabungan untuk memperbarui tabel PENJUALAN. Contoh pertama menggunakan metode sederhana menghapus dari tabel target dan kemudian memasukkan semua baris dari tabel pementasan. Contoh kedua memerlukan pembaruan pada kolom tertentu di tabel target, sehingga termasuk langkah pembaruan tambahan.
Gabungkan contohPenggunaan kumpulan data sampel untuk Amazon Redshift, yang disebut kumpulan data TICKIT. Sebagai prasyarat, Anda dapat mengatur tabel dan data TICKIT dengan mengikuti petunjuk yang tersedia di panduan Memulai tugas database umum. Informasi lebih rinci tentang kumpulan data sampel ditemukan di database Sampel.
Contoh menggabungkan sumber data
Contoh di bagian ini memerlukan sumber data sampel yang mencakup pembaruan dan sisipan. Sebagai contoh, kita akan membuat tabel sampel bernama SALES_UPDATE yang menggunakan data dari tabel SALES. Kami akan mengisi tabel baru dengan data acak yang mewakili aktivitas penjualan baru untuk bulan Desember. Kami akan menggunakan tabel sampel SALES_UPDATE untuk membuat tabel pementasan dalam contoh berikut.
-- Create a sample table as a copy of the SALES table.
create table tickit.sales_update as
select * from tickit.sales;
-- Change every fifth row to have updates.
update tickit.sales_update
set qtysold = qtysold*2,
pricepaid = pricepaid*0.8,
commission = commission*1.1
where saletime > '2008-11-30'
and mod(sellerid, 5) = 0;
-- Add some new rows to have inserts.
-- This example creates a duplicate of every fourth row.
insert into tickit.sales_update
select (salesid + 172456) as salesid, listid, sellerid, buyerid, eventid, dateid, qtysold, pricepaid, commission, getdate() as saletime
from tickit.sales_update
where saletime > '2008-11-30'
and mod(sellerid, 4) = 0;
Contoh penggabungan yang menggantikan baris yang ada berdasarkan kunci yang cocok
Skrip berikut menggunakan tabel SALES_UPDATE untuk melakukan operasi gabungan pada tabel PENJUALAN dengan data baru untuk aktivitas penjualan Desember. Contoh ini menggantikan baris dalam tabel PENJUALAN yang memiliki pembaruan. Untuk contoh ini, kami akan memperbarui kolom qtysold dan pricepaid, tetapi membiarkan komisi dan waktu penjualan tidak berubah.
MERGE into tickit.sales
USING tickit.sales_update sales_update
on ( sales.salesid = sales_update.salesid
and sales.listid = sales_update.listid
and sales_update.saletime > '2008-11-30'
and (sales.qtysold != sales_update.qtysold
or sales.pricepaid != sales_update.pricepaid))
WHEN MATCHED THEN
update SET qtysold = sales_update.qtysold,
pricepaid = sales_update.pricepaid
WHEN NOT MATCHED THEN
INSERT (salesid, listid, sellerid, buyerid, eventid, dateid, qtysold , pricepaid, commission, saletime)
values (sales_update.salesid, sales_update.listid, sales_update.sellerid, sales_update.buyerid, sales_update.eventid,
sales_update.dateid, sales_update.qtysold , sales_update.pricepaid, sales_update.commission, sales_update.saletime);
-- Drop the staging table.
drop table tickit.sales_update;
-- Test to see that commission and salestime were not impacted.
SELECT sales.salesid, sales.commission, sales.salestime, sales_update.commission, sales_update.salestime
FROM tickit.sales
INNER JOIN tickit.sales_update sales_update
ON
sales.salesid = sales_update.salesid
AND sales.listid = sales_update.listid
AND sales_update.saletime > '2008-11-30'
AND (sales.commission != sales_update.commission
OR sales.salestime != sales_update.salestime);
Contoh gabungan yang menentukan daftar kolom tanpa menggunakan MERGE
Contoh berikut melakukan operasi penggabungan untuk memperbarui PENJUALAN dengan data baru untuk aktivitas penjualan Desember. Kami membutuhkan data sampel yang mencakup pembaruan dan sisipan, bersama dengan baris yang tidak berubah. Untuk contoh ini, kami ingin memperbarui kolom QTYSOLD dan PRICEPAID tetapi membiarkan KOMISI dan SALETIME tidak berubah. Skrip berikut menggunakan tabel SALES_UPDATE untuk melakukan operasi gabungan pada tabel PENJUALAN.
-- Create a staging table and populate it with rows from SALES_UPDATE for Dec
create temp table stagesales as select * from sales_update
where saletime > '2008-11-30';
-- Start a new transaction
begin transaction;
-- Update the target table using an inner join with the staging table
-- The join includes a redundant predicate to collocate on the distribution key –- A filter on saletime enables a range-restricted scan on SALES
update sales
set qtysold = stagesales.qtysold,
pricepaid = stagesales.pricepaid
from stagesales
where sales.salesid = stagesales.salesid
and sales.listid = stagesales.listid
and stagesales.saletime > '2008-11-30'
and (sales.qtysold != stagesales.qtysold
or sales.pricepaid != stagesales.pricepaid);
-- Delete matching rows from the staging table
-- using an inner join with the target table
delete from stagesales
using sales
where sales.salesid = stagesales.salesid
and sales.listid = stagesales.listid;
-- Insert the remaining rows from the staging table into the target table
insert into sales
select * from stagesales;
-- End transaction and commit
end transaction;
-- Drop the staging table
drop table stagesales;