MERGE (プレビュー) - Amazon Redshift

MERGE (プレビュー)

これは、プレビューリリースの MERGE コマンドについて記載した暫定版ドキュメントです。ドキュメントと機能はどちらも変更されることがあります。この特徴は、本番環境ではなくテストクラスターでのみ使用することをお勧めします。パブリックプレビューは 2023 年 2 月 28 日に終了します。プレビュークラスターとプレビューサーバーレスワークグループおよび名前空間は、プレビューの終了から 2 週間後に自動的に削除されます。プレビューの利用規約については、「AWS のサービス条件」の「ベータ版とプレビュー」を参照してください。
注記

Amazon Redshift クラスターを [Preview] (プレビュー) で作成して、Amazon Redshift の新機能をテストできます。これらの機能を本番環境で使用したり、[Preview] (プレビュー) クラスターを本番クラスターや別のトラックのクラスターに移動したりすることはできません。プレビューの利用規約については、「AWS のサービス条件」の「ベータ版とプレビュー」を参照してください。

[Preview] (プレビュー) でクラスターを作成するには
  1. AWS Management Console にサインインして https://console.aws.amazon.com/redshift/で Amazon Redshift コンソールを開きます。

  2. ナビゲーションメニューで [Provisioned clusters dashboard] (プロビジョニングされたクラスターダッシュボード) を選択し、[Clusters] (クラスター) を選択します。現在の AWS リージョン にあるアカウントのクラスターがリストされています。各クラスターのプロパティのサブセットが、リストの列に表示されます。

  3. [Clusters] (クラスター) リストページに、プレビューを紹介するバナーが表示されます。[Create preview cluster] (プレビュークラスターの作成) ボタンを選択して、クラスターの作成ページを開きます。

  4. クラスターのプロパティを入力します。テストする機能を含む [Preview track] (プレビュートラック) を選択します。プレビュートラックにあることを示すクラスターの名前を入力することをお勧めします。テストする機能について、-preview というラベルの付いたオプションを含む、クラスターのオプションを選択します。クラスター作成の詳細については、「Amazon Redshift 管理ガイド」の「クラスターの作成」を参照してください。

  5. [Create preview cluster] (プレビュークラスターの作成) を選択して、プレビューのクラスターを作成します。

  6. プレビュークラスターが使用可能になったら、SQL クライアントを使用してデータをロードし、クエリを実行します。

クラスターは preview_2022 という名前のプレビュートラックで作成する必要があります。

Amazon Redshift Serverless ワークグループを [Preview] (プレビュー) で作成して、Amazon Redshift Serverless の新機能をテストできます。これらの機能を本番環境で使用したり、[Preview] (プレビュー) ワークグループを本番ワークグループに移動したりすることはできません。プレビューの利用規約については、「AWS のサービス条件」の「ベータ版とプレビュー」を参照してください。

[Preview] (プレビュー) でワークグループを作成するには
  1. AWS Management Console にサインインして https://console.aws.amazon.com/redshift/で Amazon Redshift コンソールを開きます。

  2. ナビゲーションメニューで [Severless dashboard] (Serverless ダッシュボード) を選択し、[Workgroup configuration] (ワークグループの設定) を選択します。現在の AWS リージョン にあるアカウントのワークグループがリストされています。各ワークグループのプロパティのサブセットが、リストの列に表示されます。

  3. [Workgroups] (ワークグループ) リストページに、プレビューを紹介するバナーが表示されます。[Create preview workgroup] (プレビューワークグループの作成) ボタンを選択して、ワークグループの作成ページを開きます。

  4. ワークグループのプロパティを入力します。プレビューにあることを示すワークグループの名前を入力することをお勧めします。テストする機能について、-preview というラベルの付いたオプションを含む、ワークグループのオプションを選択します。ページを進めて、ワークグループと名前空間のオプションを入力します。ワークグループの作成に関する一般情報については、「Amazon Redshift 管理ガイド」の「名前空間を持つワークグループの作成」を参照してください。

  5. [Create preview workgroup] (プレビューワークグループの作成) を選択して、プレビューのワークグループを作成します。

  6. プレビューのワークグループが使用可能になったら、SQL クライアントを使用してデータをロードし、クエリを実行します。

ソーステーブルの行を条件付きでターゲットテーブルにマージします。従来、これは複数の insert、update、delete ステートメントを別々に使用することによってのみ実現していました。MERGE で組み合わせることができる操作の詳細については、「UPDATE」、「DELETE」、「INSERT」を参照してください。

構文

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 } [, ...] )

パラメータ

target_table

MERGE ステートメントがマージされる一時または永続テーブル。

source_table

target_table にマージする行を提供する一時または永続テーブル。source_table は、Spectrum テーブル、Postgres federated テーブル、または MySQL federated テーブルにすることもできます。source_table をビューまたはサブクエリにすることはできません。

alias

source_table の一時的な代替名。

このパラメータはオプションです。alias の先頭に AS を付けることもできます。

match_condition

ソーステーブルの列とターゲットテーブルの列の間に等しい述語を指定します。これを使用して、source_table の行が target_table の行と一致するかどうかを判断します。条件が満たされると、MERGE はその行に対して matched_clause を実行します。それ以外の場合は、MERGE はその行に対して not_matched_clause を実行します。

WHEN MATCHED

ソース行とターゲット行の一致条件が True と評価された場合に実行するアクションを指定します。UPDATE アクションまたは DELETE アクションのいずれかを指定できます。

UPDATE

target_table 内の一致した行を更新します。指定した col_name の値のみが更新されます。

DELETE

target_table 内の一致した行を削除します。

WHEN NOT MATCHED

一致条件が False または Unknown と評価された場合に実行するアクションを指定します。この句には INSERT 挿入アクションのみを指定できます。

INSERT

target_table に 1 行挿入します。ターゲットの col_name は、任意の順序でリストできます。col_name の値を指定しない場合、デフォルトの順序は、テーブルのすべての列が宣言した順序になります。

col_name

修正する 1 つまたは複数の列名。ターゲット列を指定する際にテーブル名を含めないでください。

expr

col_name の新しい値を定義する式。

使用に関する注意事項

  • MERGE ステートメントを実行するには、source_tabletarget_table の両方の所有者であるか、それらのテーブルの SELECT 権限を持っている必要があります。さらに、MERGE ステートメントに含まれるオペレーションに応じて、target_table の UPDATE、DELETE、および INSERT 権限が必要です。

  • target_table をシステムテーブル、カタログテーブル、または外部テーブルにすることはできません。

  • source_tabletarget_table を同じテーブルにすることはできません。

  • MERGE ステートメントで WITH 句を使用することはできません。

  • source_table 内の行を target_table 内の複数の行と一致させることはできません。

  • match_conditionexpr はSUPER 型の列を部分的に参照することはできません。例えば、SUPER 型のオブジェクトが配列または構造体である場合、その列の個々の要素を match_conditionexpr に使用することはできませんが、列全体を使用することはできます。

    次の例を考えます。

    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.

    SUPER 型の詳細については、「SUPER 型」を参照してください。

  • UPDATE 操作を含む MERGE ステートメントでは、パフォーマンスを向上させるために次のステップを実行することをお勧めします。

    • target_table の結合列をプライマリキーとして定義します。

    • UPDATE オペレーションを実行すると、target_table 内のすべての列が更新されます。

    • UPDATE および INSERT オペレーションでは expr を同じにしておきます。

  • プライマリキー列に重複する値がある場合、MERGE は重複した値を削除できます。これが可能なのは、Amazon Redshift ではプライマリキー制約が強制されないためです。詳細については、「テーブル制約の定義」を参照してください。

    次の例を考えます。

    CREATE TABLE target (id INT, name CHAR(10), PRIMARY KEY(id)); CREATE TABLE source (id INT, name CHAR(10)); INSERT INTO target VALUES (101, 'Bob'), (101, 'John'), (102, 'Susan'); INSERT INTO source VALUES (101, 'Tony'), (103, 'Alice'); 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 | Tony 102 | Susan 103 | Alice (3 rows)

    MERGE ステートメントの前に、target_table には ID 値が 101 で名前の値が異なる 2 つの別個の行があります。MERGE ステートメントを実行すると、ID が 101 の行が 1 つのみ残ります。

  • source_table が大きい場合は、target_tablesource_table の両方の結合列を分散キーとして定義するとパフォーマンスが向上する可能性があります。

次の例では、2 つのテーブルを作成し、それらに対して MERGE オペレーションを実行して、ターゲットテーブルの一致する行を更新し、一致しない行を挿入します。次に、ソーステーブルに別の値を挿入し、別の MERGE オペレーションを実行します。今度は、一致する行を削除して、ソーステーブルから新しい行を挿入します。

まず、ソーステーブルとターゲットテーブルを作成してデータを入力します。

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)

次に、ソーステーブルをターゲットテーブルにマージし、ターゲットテーブルを一致する行で更新し、一致しない行をソーステーブルから挿入します。

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)

なお、ID 値が 102 と 103 の行は、ターゲットテーブルの名前値と一致するように更新されます。また、ID 値が 104 で名前値が Bill の新しい行がターゲットテーブルに挿入されます。

次に、ソーステーブルに新しい行を挿入します。

INSERT INTO source VALUES (105, 'David'); SELECT * FROM source; id | name -----+------------ 102 | Tony 103 | Alice 104 | Bill 105 | David (4 rows)

最後に、MERGE オペレーションを実行して、ターゲットテーブルから一致する行を削除し、一致しない行を挿入します。

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)

ID 値が 102、103、104 の行がターゲットテーブルから削除され、ID 値が 105 で名前値が David の新しい行がターゲットテーブルに挿入されます。

以下も参照してください。

INSERT, UPDATE, DELETE