Exemples de fusion - Amazon Redshift

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Exemples de fusion

Les exemples suivants effectuent une fusion pour mettre à jour la table SALES. Le premier exemple utilise la méthode la plus simple pour supprimer les lignes de la table cible, puis insérer toutes les lignes de la table intermédiaire. Comme le deuxième exemple nécessite une mise à jour des colonnes de la sélection, elle inclut une étape de mise à jour supplémentaire.

Exemples de fusion utilise un exemple de jeu de données pour Amazon Redshift, appelé jeu de données TICKIT. Comme condition préalable, vous pouvez configurer les tables et les données TICKIT en suivant les instructions disponibles dans le guide Démarrage avec les tâches courantes liées aux bases de données. Des informations plus détaillées sur le jeu de données en exemple sont disponibles dans la base de données en exemple.

Exemple de source de données de fusion

Les exemples de cette section nécessitent un exemple de source de données qui inclut les mises à jour et les insertions. Pour les exemples, nous allons créer un exemple de table nommée SALES_UPDATE qui utilise les données de la table SALES. Nous allons remplir la nouvelle table avec des données aléatoires qui représentant les nouvelles activités de vente pour décembre. Nous allons utiliser l’exemple de table SALES_UPDATE pour créer la table intermédiaire dans les exemples suivants.

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

Exemple de fusion qui remplace les lignes existantes sur la base de clés correspondantes

Le script suivant utilise la table SALES_UPDATE pour effectuer une opération de fusion sur la table SALES avec de nouvelles données pour l’activité de vente de décembre. Cet exemple remplace les lignes de la table SALES qui ont été mises à jour. Pour cet exemple, nous allons mettre à jour les colonnes qtysold et pricepaid, mais laisser commission et saletime inchangées.

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

Exemple de fusion qui spécifie une liste de colonnes sans utiliser MERGE

L’exemple suivant effectue une opération de fusion pour mettre à jour SALES avec de nouvelles données pour l’activité de vente de décembre. Nous avons besoin d’exemples de données qui incluent les opérations de mise à jour et d’insertion, ainsi que les lignes qui n’ont pas changé. Pour cet exemple, nous voulons mettre à jour les colonnes QTYSOLD et PRICEPAID, mais laisser COMMISSION et SALETIME telles quelles. Le script suivant utilise la table SALES_UPDATE pour effectuer une opération de fusion sur la table 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;