メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012-12-01)

UPDATE ステートメントの例

TICKIT データベースの CATEGORY テーブルには、次の行が含まれています。

Copy
catid | catgroup | catname | catdesc -------+----------+-----------+----------------------------------------- 1 | Sports | MLB | Major League Baseball 2 | Sports | NHL | National Hockey League 3 | Sports | NFL | National Football League 4 | Sports | NBA | National Basketball Association 5 | Sports | MLS | Major League Soccer 6 | Shows | Musicals | Musical theatre 7 | Shows | Plays | All non-musical theatre 8 | Shows | Opera | All opera and light opera 9 | Concerts | Pop | All rock and pop music concerts 10 | Concerts | Jazz | All jazz singers and bands 11 | Concerts | Classical | All symphony, concerto, and choir concerts (11 rows)

値の範囲に基づくテーブルの更新

CATID 列の値の範囲に基づいて、CATGROUP 列を更新します。

Copy
update category set catgroup='Theatre' where catid between 6 and 8;
Copy
select * from category where catid between 6 and 8; catid | catgroup | catname | catdesc -------+----------+-----------+-------------------------------------------- 6 | Theatre | Musicals | Musical theatre 7 | Theatre | Plays | All non-musical theatre 8 | Theatre | Opera | All opera and light opera (3 rows)

現在の値に基づくテーブルの更新

現在の CATGROUP 値に基づいて、CATNAME 列と CATDESC 列を更新します。

Copy
update category set catdesc=default, catname='Shows' where catgroup='Theatre';
Copy
select * from category where catname='Shows'; catid | catgroup | catname | catdesc -------+----------+-----------+-------------------------------------------- 6 | Theatre | Shows | 7 | Theatre | Shows | 8 | Theatre | Shows | (3 rows)

このケースでは、テーブルの作成時にデフォルト値が定義されていなかったため、CATDESC 列は Null に設定されています。

次のコマンドを実行して、CATEGORY テーブルのデータを元の値に設定し直します。

Copy
truncate category; copy category from 's3://mybucket/data/category_pipe.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' delimiter '|';

WHERE 句のサブクエリの結果に基づく、テーブルの更新

WHERE 句のサブクエリの結果に基づいて、CATEGORY テーブルを更新します。

Copy
update category set catdesc='Broadway Musical' where category.catid in (select category.catid from category join event on category.catid = event.catid join venue on venue.venueid = event.venueid join sales on sales.eventid = event.eventid where venuecity='New York City' and catname='Musicals');

更新したテーブルを表示します。

Copy
select * from category order by 1; catid | catgroup | catname | catdesc -------+----------+-----------+-------------------------------------------- 1 | Sports | MLB | Major League Baseball 2 | Sports | NHL | National Hockey League 3 | Sports | NFL | National Football League 4 | Sports | NBA | National Basketball Association 5 | Sports | MLS | Major League Soccer 6 | Shows | Musicals | Broadway Musical 7 | Shows | Plays | All non-musical theatre 8 | Shows | Opera | All opera and light opera 9 | Concerts | Pop | All rock and pop music concerts 10 | Concerts | Jazz | All jazz singers and bands 11 | Concerts | Classical | All symphony, concerto, and choir concerts (11 rows)

結合条件の結果に基づく、テーブルの更新

EVENT テーブルの CATID 行と一致する項目に基づいて、CATEGORY テーブル内の元の 11 行を更新します。

Copy
update category set catid=100 from event where event.catid=category.catid; select * from category order by 1; catid | catgroup | catname | catdesc -------+----------+-----------+-------------------------------------------- 1 | Sports | MLB | Major League Baseball 2 | Sports | NHL | National Hockey League 3 | Sports | NFL | National Football League 4 | Sports | NBA | National Basketball Association 5 | Sports | MLS | Major League Soccer 10 | Concerts | Jazz | All jazz singers and bands 11 | Concerts | Classical | All symphony, concerto, and choir concerts 100 | Shows | Opera | All opera and light opera 100 | Shows | Musicals | Musical theatre 100 | Concerts | Pop | All rock and pop music concerts 100 | Shows | Plays | All non-musical theatre (11 rows)

EVENT テーブルは FROM 句内で一覧表示され、ターゲットテーブルに対する結合条件は WHERE 句内で定義されます。更新用に限定される行は 4 行だけです。

Copy
select distinct catid from event; catid ------- 9 8 6 7 (4 rows)

これらの 4 行は、CATID 値が元々 6、7、8、および 9 だった行です。この 4 つのカテゴリだけが、EVENT テーブル内で表現されます。

前の例を拡張して、WHERE 句に別の条件を追加することで、CATEGORY テーブル内の元の 11 行を更新します。

Copy
update category set catid=100 from event where event.catid=category.catid and catgroup='Concerts'; select * from category where catid=100; catid | catgroup | catname | catdesc -------+----------+---------+--------------------------------- 100 | Concerts | Pop | All rock and pop music concerts (1 row)

CATGROUP 列に関する制限により、更新用に限定される行は 1 行だけです (ただし、結合用には 4 行は有資格となります)。

この例を作成するためのもう 1 つの方法を次に示します。

Copy
update category set catid=100 from event join category cat on event.catid=cat.catid where cat.catgroup='Concerts';

この方法のメリットは、結合基準が、更新対象の行を限定する他の規格と明確に分離されることです。FROM 句の CATEGORY テーブルに対するエイリアス CAT の使用に注意してください。

FROM 句内の外部結合を使った更新

前の例では、UPDATE ステートメントの FROM 句で指定した内部結合を示しました。次の例では、FROM 句がターゲットテーブルに対する外部結合をサポートしていないため、エラーが返されます。

Copy
update category set catid=100 from event left join category cat on event.catid=cat.catid where cat.catgroup='Concerts'; ERROR: Target table must be part of an equijoin predicate
Copy
update category set catid=100 from (select event.catid from event left join category cat on event.catid=cat.catid) eventcat where category.catid=eventcat.catid and catgroup='Concerts';

UPDATE ステートメントに対して外部結合が必要な場合、外部結合構文をサブクエリに移動することができます。