この文は、テーブル、ビュー、およびシステム・プロシージャの結果をテーブルまたはビューにマージするときに使用します。
MERGE INTO target-object [ into-column-list ] USING [ WITH AUTO NAME ] source-object ON merge-search-condition merge-operation […] [ OPTION ( query-hint, ... ) ]
target-object: [ userid.]target-table-name [ [ AS ] target-correlation-name ] | [ userid.]target-view-name [ [ AS ] target-correlation-name ] | ( select-statement ) [ AS ] target-correlation-name
source-object : [ userid.]source-table-name [ [ AS ] source-correlation-name ] [ WITH ( table-hints ) ] | [ userid.]source-view-name [ [ AS ] source-correlation-name ] | [ userid.]source-mat-view-name [ [ AS ] source-correlation-name ] | ( select-statement ) [ AS ] source-correlation-name [ using-column-list ] | procedure
procedure : [ owner.]procedure-name ( procedure-syntax ) [ WITH ( column-name data-type, ... ) ] [ [ AS ] source-correlation-name ]
merge-search-condition :
search-condition
| PRIMARY KEY
merge-operation : WHEN MATCHED [ AND search-condition ] THEN match-action | WHEN NOT MATCHED [ AND search-condition ] THEN not-match-action
match-action : DELETE | RAISERROR [ error-number ] | SKIP | UPDATE SET set-item, ... | UPDATE [ DEFAULTS { ON | OFF } ]
not-match-action : INSERT | INSERT [ insert-column-list ] VALUES ( value, ... ) | RAISERROR [ error-number ] | SKIP
set-item : [target-correlation-name.]column-name = { expression | DEFAULT } | [ owner-name.]target-table-name.column-name = { expression | DEFAULT }
insert-column-list : ( column-name, ... )
query-hint : MATERIALIZED VIEW OPTIMIZATION option-value | FORCE OPTIMIZATION | option-name = option-value
into-column-list : ( column-name, ... )
using-column-list : ( column-name, ... )
error-number : 17000 より大きい正の整数または変数
option-name : identifier
option-value : hostvar (許容されたインジケータ), string, identifier, または number
table-hints:FROM 句を参照してください。
search-condition:探索条件を参照してください。
set-clause-list:SET 文を参照してください。
INTO 句 この句は、MERGE 文のターゲットとなるオブジェクトを定義するときに使用します。target-object には、ベース・テーブル、通常のビュー、または派生テーブルの名前を指定できます。マテリアライズド・ビューは指定できません。派生テーブルまたはビューは、更新可能なクエリ・ブロックである必要があります。たとえば、ビュー定義または派生テーブル定義に UNION、INTERSECT、EXCEPT、または GROUP BY が含まれている場合、MERGE 文のターゲットとなるオブジェクトとしては使用できません。
target-object が派生テーブルの場合、オプションの into-column-list を使用すると、派生テーブルのカラムに代替名を指定できます。このように使用する場合は、into-column-list のサイズが派生テーブルのカラム・リストと一致し、2 つのリストの順序も同じである必要があります。
target-object がベース・テーブルまたはビューの場合、into-column-list を使用すると、MERGE 文が終わるまでテーブルのカラムまたはビューのカラムのサブセットを関連として指定できます。
データベース・サーバは into-column-list を使用して、次の項目を解析します。
WHEN MATCHED 句の中に SET 句のない UPDATE
WHEN NOT MATCHED 句の中に VALUES 句のない INSERT
ON 句の中の PRIMARY KEY 探索条件
USING 句の中の WITH AUTO NAME 句
into-column-list を指定しない場合、into-column-list には target-object のすべてのカラムが含まれていると見なされます。
USING 句 この句は、マージ元のデータ・ソースを定義するときに使用します。source-object には、ベース・テーブル (テーブル・ヒントを含む)、ビュー、マテリアライズド・ビュー、派生テーブル、またはプロシージャを指定できます。source-object が派生テーブルの場合は、using-column-list を指定できます。using-column-list を指定しない場合は、source-object のすべてのカラムが使用されます。
WITH AUTO NAME 句 この句は、target-object の into-column-list カラム内のカラムに一致するカラム名を、サーバがマージ操作で自動的に使用するように指定するときに使用します。次の例は同等であり、WITH AUTO NAME を指定すると、into-column-list 内のカラムの順序が、source-object 内のカラム名に一致するように変更されることを示します。
... INTO T ( Name, ID, Description ) USING WITH AUTO NAME ( SELECT Description, Name, ID FROM PRODUCTS WHERE Description LIKE '%cap%') ... INTO T ( Description, Name, ID ) USING ( SELECT Description, Name, ID FROM PRODUCTS WHERE Description LIKE '%cap%' ) |
ON 句 この句は、source-object 内のローを target-object 内のローに一致させるための条件を指定するときに使用します。
探索条件構文の詳細については、探索条件を参照してください。
target-object のプライマリ・キー定義に基づいて source-object のローを一致させるには、ON PRIMARY KEY を指定します。source-object にプライマリ・キーは必要ありません。ただし、target-object にはプライマリ・キーが必要です。ON PRIMARY KEY を指定すると、次のようになります。
target-object がベース・テーブルでない場合、またはプライマリ・キーがない場合はエラーが返されます。
into-column-list 内に 1 つ以上のプライマリ・キー・カラムが含まれていない場合はエラーが返されます。
into-column-list 内のすべてのプライマリ・キー・カラムが using-column-list 内の対応するカラムと一致している場合、into-column-list と using-column-list のカラム数が異なる可能性があります。たとえば、into-column-list が (I1, I2, I3)、using-column-list が (U1, U2)、プライマリ・キー・カラムが (I2, I3) の場合、target-object のプライマリ・キー・カラム (I3) が using-column-list で一致しないため、エラーが返されます。
プライマリ・キーの定義に関係なく、into-column-list のプライマリ・キー・カラムと using-column-list の式の一致は、into-column-list 内のプライマリ・キー・カラムの位置に左右されます。たとえば、target-object のプライマリ・キーが (B, C) と定義されており、into-column-list が (E, C, F, A, D, B) であると想定します。ON PRIMARY KEY を指定すると、target-object のカラム B は into-column-list の 6 番目の位置にあるため、using-column-list の 6 番目の要素と比較されます。同様に、target-object のカラム C は using-column-list の 2 番目の要素と比較されます。
ON PRIMARY KEY は、対応する ON 条件の構文上の省略形です。たとえば、into-column-list が (I1, I2, .. In)、対応する一致した using-column-list が (U1, U2, .. Um) であると仮定します。また、target-object のプライマリ・キー・カラムが I1, I2, I3 であり、プライマリ・キー・カラムがすべて into-column-list に含まれているとします。この場合、merge-search-condition は、連結された "I1=U1 AND I2=U2 AND I3=U3"
と定義されます。
WHEN MATCHED 句と WHEN NOT MATCHED 句 WHEN MATCHED 句と WHEN NOT MATCHED 句は、source-object のローが target-object のローに一致する場合、または一致しない場合に実行するアクションを定義するときに使用します。アクションは、THEN キーワードの後に指定します。追加の AND 句を指定すると、一致するローのサブセットまたは一致しないローのサブセットに実行するアクションを制御できます。
ON 句を使用すると、source-object のローを、一致するローと一致しないローに分類する方法が決まります。target-object 内の少なくとも 1 つのローについて ON 句が TRUE の場合、source-object 内のローは一致するローと見なされます。target-object 内のどのローも ON 句が TRUE でない場合、source-object のローは一致しないローと見なされます。複数の WHEN MATCHED 句と WHEN NOT MATCHED 句を使用すると、一致するローと一致しないローのセットが切断のサブセットに分割されます。各サブセットは WHEN 句によって処理されます。WHEN MATCHED 句と WHEN NOT MATCHED 句は、MERGE 文に記載されている順序で処理されます。
WHEN MATCHED 句または WHEN NOT MATCHED 句の AND 句で指定した探索条件によって、候補となるローを特定の句で処理するかどうかが決まります。AND 句なしで WHEN MATCHED 句または WHEN NOT MATCHED 句を指定すると、AND 句の探索条件は TRUE であると見なされます。あるローが複数句の AND 条件を満たす場合、そのローは MERGE 文で最初に記載されている句によって処理されます。
同じ target-object のローを WHEN MATCHED 句のいずれかが複数回処理した場合は、エラーが返されます。1 つの target-object のローは、source-object の 2 つの異なる入力ローに一致する場合、同じ WHEN MATCHED 句の同じサブセットに複数回割り当てられます。
次の例では、target-object の Products で ID 300 のローが source-object の SalesOrderItems の 111 のローに一致するため、エラーが返されます。すべての一致は、WHEN MATCHED THEN UPDATE 句に対応する同じサブセットに属しています。
MERGE INTO Products USING SalesOrderItems S ON S.ProductID = Products.ID WHEN MATCHED THEN UPDATE SET Products.Quantity = 20; |
「WHEN MATCHED」:一致するローの場合、match-action には次のいずれかのアクションを指定できます。
RAISERROR RAISERROR は、マージ操作を終了し、変更をロールバックしてエラーを返すときに指定します。デフォルトでは、RAISERROR を指定すると、データベース・サーバは SQLSTATE 23510 と SQLCODE -1254 を返します。必要に応じて、RAISERROR キーワードの後に error-number パラメータを指定すると、返される SQLCODE をカスタマイズできます。カスタム SQLCODE には 17000 よりも大きい正の整数を指定してください。数または変数のいずれとしても指定できます。カスタム SQLCODE を指定すると、負の数が返されます。
たとえば、WHEN MATCHED AND search-condition THEN RAISERROR 17001
を指定すると、WHEN 句の条件を満たすローが検出された場合、マージ操作は失敗し、変更がロールバックされ、SQLSTATE 23510 と SQLCODE -17001 を持つエラーが返されます。RAISERROR アクションの使用を参照してください。
UPDATE UPDATE SET は、set-item 値を使用してローを更新するときに指定します。set-item は単純な割り当て式であり、カラムは expression の値に設定されます。expression には制限がありません。また、DEFAULT を指定すると、カラムをカラム用に定義されているデフォルトに設定できます。
たとえば、UPDATE SET target-column1=DEFAULT, target-column2=source-column2
によって、target-column1 はデフォルト値に設定され、target-column2 は source-object の source-column2 の修正ローと同じに設定されます。
SET 句を指定しない場合、SET 句は into-column-list と using-column-list によって定義されます。たとえば、into-column-list が (I1, I2, .. In)、using-column-list が (U1, U2, .. Un) である場合、SET 句には "SET I1=U1 , I2=U2 , .. In=Un"
が使用されます。
「WHEN NOT MATCHED」:一致しないローの場合、non-match-action には次のいずれかのアクションを指定できます。
INSERT INSERT ... VALUES は、指定した値を使用してローを挿入するときに指定します。VALUES 句なしで INSERT 句を指定すると、VALUES 句は into-column-list と using-column-list によって定義されます。たとえば、into-column-list が (I1, I2, .. In)、using-column-list が (U1, U2, .. Un) である場合、VALUES 句のない INSERT は INSERT (I1, I2, .. In) VALUES (U1, U2, .. Un)
と同義になります。
RAISERROR RAISERROR は、マージ操作を終了し、変更をロールバックしてエラーを返すときに指定します。RAISERROR を指定すると、データベース・サーバはデフォルトで SQLSTATE 23510 および SQLCODE -1254 を返します。必要に応じて、RAISERROR キーワードの後に error-number パラメータを指定し、返される SQLCODE をカスタマイズできます。カスタム SQLCODE には 17000 よりも大きい正の整数を指定してください。数または変数のいずれとしても指定できます。カスタム SQLCODE を指定すると、負の数が返されます。
たとえば、WHEN NOT MATCHED AND search-condition THEN RAISERROR 17001
を指定すると、WHEN 句の条件を満たすローが検出された場合、マージ操作は失敗し、変更がロールバックされ、SQLSTATE 23510 と SQLCODE -17001 を持つエラーが返されます。RAISERROR アクションの使用を参照してください。
OPTION 句 この句は、文を実行するためのヒントを指定するときに使用します。次のヒントがサポートされます。
これらのオプションの詳細については、SELECT 文の OPTIONS 句の説明を参照してください。
source-object 内のローは target-object 内のローと比較され、ON 句の条件を満たすかどうかに応じて一致または不一致となります。merge-search-condition が true になるローが少なくとも 1 つ target-table に存在する場合、source-object のローは一致と見なされます。AND 句で指定された探索条件に従い、一致するローと一致しないローは WHEN MATCHED 句と WHEN NOT MATCHED 句で定義されたアクションによってグループ分けされます。一致するアクションと一致しないアクションごとにローをグループ化することを「分岐化」と呼び、各グループを「分岐」と呼びます。
分岐化が完了すると、データベースは分岐のローに定義されたアクションの実行を開始します。分岐は、出現した順序で処理されます。これは、文の中に WHEN 句が出現する順序と一致します。分岐化中、source-object の複数のローに、target-object の同じローに定義されたアクションがある場合、マージ操作は失敗してエラーが返されます。このことによって、target-object の指定されたローでマージ操作が複数のアクションを実行することがなくなります。
分岐が処理されると、挿入、更新、および削除の各アクションがそれぞれ INSERT 文、UPDATE 文、および DELETE 文としてトランザクション・ログに記録されます。
トリガによるマージ操作への影響の詳細については、MERGE 文を使用したデータのインポートを参照してください。
DBA 権限または次の権限が必要です。
MERGE 文で INSERT、UPDATE、または DELETE の各アクションを指定する場合は、target-object の INSERT、UPDATE、および DELETE パーミッション。
MERGE 文で参照されるすべてのオブジェクトに対する SELECT パーミッション。
MERGE 文で参照されるすべてのプロシージャに対する EXECUTE パーミッション。
target-object にトリガが定義されていると、そのトリガが起動されます。
SQL/2003 MERGE 文は SQL/2003 標準の機能 F312 です。SQL Anywhere の MERGE 文は、SQL/2003 標準の MERGE 文仕様に準拠しており、追加の拡張が行われています。MERGE 文に対するこれらの拡張の一部は、今後予定されている SQL/2008 標準に準拠しています。これらのコードを以下に示します。
複数の WHEN MATCHED 句と WHEN NOT MATCHED 句
WHEN [NOT] MATCHED 句を指定した [ AND search-condition ]
WHEN MATCHED 句の中の DELETE
WHEN [NOT] MATCHED 句の中の RAISERROR
WHEN [NOT] MATCHED 句の中の SKIP
OPTION 句
PRIMARY KEY 句
DEFAULTS 句
VALUES 句を指定しない INSERT 句
WITH AUTO NAME 句
SET 句を指定しない UPDATE 句
次の例は、派生テーブルのローを Products テーブルにマージします。この例は、既存の T シャツと同じ属性で、色、数量、および製品識別子の異なる新しい T シャツを追加します。ここでは、ID 番号 304 の製品が Products テーブルにすでに存在すると、ローは挿入されません。
MERGE INTO Products ( ID, Name, Description, Size, Color, Quantity, UnitPrice, Photo ) USING WITH AUTO NAME ( SELECT 304 AS ID, 'Purple' AS Color, 100 AS Quantity, Name, Description, Size, UnitPrice, Photo FROM Products WHERE Products.ID = 300 ) AS DT ON PRIMARY KEY WHEN NOT MATCHED THEN INSERT; |
次の例は、前の例と同じですが、構文上の省略形を使用しません。
MERGE INTO Products ( ID, Name, Description, Size, Color, Quantity, UnitPrice, Photo ) USING ( SELECT 304 AS ID, 'Purple' AS Color, 100 AS Quantity, Name, Description, Size, UnitPrice, Photo FROM Products WHERE Products.ID = 300 ) AS DT ( ID, Name, Description, Size, Color, Quantity, UnitPrice, Photo ) ON ( Products.ID = DT.ID ) WHEN NOT MATCHED THEN INSERT ( ID, Name, Description, Size, Color, Quantity, UnitPrice, Photo ) VALUES ( DT.ID, DT.Name, DT.Description, DT.Size, DT.Color, DT.Quantity, DT.UnitPrice, DT.Photo ); |
MERGE 文の例の詳細については、MERGE 文を使用したデータのインポートを参照してください。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |