

 Amazon Redshift non supporterà più la creazione di nuovi Python UDFs a partire dalla Patch 198. Python esistente UDFs continuerà a funzionare fino al 30 giugno 2026. Per ulteriori informazioni, consulta il [post del blog](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/). 

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Esempi di unione
<a name="merge-examples"></a>

Negli esempi seguenti viene eseguita un'unione per aggiornare la tabella SALES. Il primo esempio utilizza il metodo più semplice di eliminazione dalla tabella di destinazione e quindi l'inserimento di tutte le righe dalla tabella di gestione temporanea. La seconda fase richiede l'aggiornamento su colonne selezionate nella tabella di destinazione, quindi include una fase di aggiornamento aggiuntiva. 

Gli [Esempi di unione](#merge-examples) utilizzano un set di dati di esempio per Amazon Redshift, chiamato TICKIT. Come prerequisito, puoi configurare le tabelle e i dati TICKIT seguendo le istruzioni disponibili in [Nozioni di base sulle attività di database comuni](https://docs.aws.amazon.com/redshift/latest/gsg/database-tasks.html). Informazioni più dettagliate sul set di dati di esempio sono disponibili in [Database di esempio](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html). 

**Origine dati di unione di esempio**

Gli esempi in questa sezione richiedono un'origine dati di esempio che includa sia gli aggiornamenti sia gli inserimenti. Per gli esempi, creeremo una tabella di esempio denominata SALES\$1UPDATE che utilizza i dati dalla tabella SALES. Popoleremo la nuova tabella con dati casuali che rappresentano nuove attività di vendita per dicembre. Utilizzeremo la tabella di esempio SALES\$1UPDATE per creare la tabella di gestione temporanea negli esempi che seguono. 

```
-- 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;
```

**Esempio di un'unione che sostituisce le righe esistenti in base alle chiavi di corrispondenza**

Il seguente script utilizza la tabella SALES\$1UPDATE per eseguire un'operazione di unione nella tabella SALES con nuovi dati per l'attività di vendita di dicembre. Questo esempio sostituisce le righe della tabella SALES che contengono aggiornamenti. Per questo esempio, vogliamo aggiornare le colonne QTYSOLD e PRICEPAID e non modificare COMMISSION e SALETIME.

```
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);
```

**Esempio di un'unione che specifica un elenco di colonne senza usare MERGE**

L'esempio seguente esegue un'operazione di unione per aggiornare SALES con i nuovi dati per l'attività di vendita di dicembre. Sono necessari dati di esempio che includano sia gli aggiornamenti sia gli inserimenti, oltre alle righe che non sono state modificate. Per questo esempio, vogliamo aggiornare le colonne QTYSOLD e PRICEPAID e non modificare COMMISSION e SALETIME. Il seguente script utilizza la tabella SALES\$1UPDATE per eseguire un'operazione di unione nella tabella SALES. 

```
-- 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;
```