# マージ

Merge プレフィックスをスクリプト内の任意の LOAD または SELECT ステートメントに追加して、ロードされたテーブルを別のテーブルに統合する必要があることを指定できます。また、このステートメントを部分的なリロードで実行する必要があることも指定します。

一般的な使用例は、変更ログをロードし、これを使用して inserts、updates、deletes を既存のテーブルに適用する場合です。

情報メモ部分的なリロードが正しく機能するためには、部分的なリロードがトリガーされる前に、アプリケーションをデータで開く必要があります。

[リロード] ボタンを使用して部分的なリロードを実行します。詳細については、「[ボタン](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Sense_Hub/Visualizations/Button/button.htm)」を参照してください。Qlik Engine JSON API を使用することもできます。

スケジュールで部分的なリロードを実行するには、アプリケーションで the 詳細 icon をクリックしてから、 [リロードをスケジュール] を選択します。開いたダイアログ ボックスで、[部分的なリロード] をオンにします。

構文:

Merge [only] [(SequenceNoField [, SequenceNoVar])] On ListOfKeys [Concatenate [(TableName)]] (loadstatement | selectstatement)

引数：

引数

| 引数 | 説明 |
| --- | --- |
| only | ステートメントが部分的なリロード中にのみ実行される必要があることを示すオプションの修飾子。通常の (部分的ではない) リロード中はステートメントは無視されます。 |
| SequenceNoField | 操作の順序を定義する日付と時刻またはシーケンス番号を含む項目の名前。 |
| SequenceNoVar | マージされるテーブルの SequenceNoField の最大値が割り当てられる変数の名前。 |
| ListOfKeys | 主キーを指定する項目名のコンマ区切りのリスト。 |
| Operation | load ステートメントの最初の項目には、次の操作は含まれている必要があります: 'Insert'、'Update'あるいは'Delete'。‘i’、‘u’および ‘d’も受け入れ可能です。 |

## 一般的機能

通常の (部分的ではない) リロード中、[Merge] [LOAD] 構造は通常の [Load] ステートメントとして機能しますが、古い廃止されたレコードと削除のマークが付けられたレコードを削除する追加機能があります。Loadステートメントの最初の項目は、操作に関する情報: (Insert、Update または Delete) を保持する必要があります。

ロードされたレコードごとに、レコード ID が以前にロードされたレコードと比較され、最新のレコード (シーケンス番号による) のみが保持されます。最新のレコードが Delete でマークされている場合、何も保持されません。

### ターゲット テーブル

変更するテーブルは、一連のフィールドにより決まります。同じ一連のフィールド（最初のフィールドと操作を除く）を持つテーブルが既に存在する場合、これは変更すべき関連テーブルになります。または、Concatenater(連結) プレフィックスを使用してテーブルを指定することもできます。ターゲット テーブルが指定されていない場合、Merge LOAD 構築結果は新規テーブルに保存されます。

Concatenateプレフィックスが使用されている場合、結果としてできたテーブルには、既存テーブルの結合とマージへの入力に対応する一連フィールドが含まれます。したがって、ターゲット テーブルは、マージへの入力として使用される変更ログよりも多くのフィールドを持つ可能性があります。

部分的なリロードは、完全なリロードと同じように実行されます。1つの違いは、部分的なリロードは、新規テーブルを作成することがほとんどないことです。Only句を使用しない限り、前のスクリプト実行と同じ一連のフィールドを持つターゲット テーブルは常に存在します。

### シーケンス番号

ロードされた変更ログが累積ログである場合、つまり、すでにロードされている変更が含まれている場合、パラメーター SequenceNoVar を Where 句で使用して、入力データの量を制限できます。次に、項目 SequenceNoField が SequenceNoVar より大きいレコードのみをロードするように Merge LOAD を作成できます。完了すると、Merge LOAD は、SequenceNoField 項目に表示される最大値を持つ新しい値を SequenceNoVar に割り当てます。

### [Operations] (操作)

Merge LOAD は、ターゲット テーブルよりも少ないフィールドを持つことができます。操作が異なれば、欠落しているフィールドの処理も異なります:

挿入: Merge LOAD で欠落しているが、ターゲット テーブルに存在するフィールドは、ターゲット テーブルで NULL を取得します。

削除: 欠落しているフィールドは結果に影響しません。いずれにせよ関連レコードは削除されます。

更新: Merge LOAD で一覧表示されているフィールドは、ターゲット テーブルで更新されます。欠落しているフィールドは、変更されません。これは、次の 2 つのステートメントが同一でないことを意味します。

* Merge on Key Concatenate Load 'U' as Operation, Key, F1, Null() as F2 From ...;
* Merge on Key Concatenate Load 'U' as Operation, Key, F1 From ...;

最初のステートメントは、一覧表示されたレコードを更新し、F2 を NULL に変更します。２番目のステートメントは F2 を変更しませんが、その代わり、ターゲット テーブルに値を残します。

[](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Merge.htm)

#### 例

## 例 1: 指定されたテーブルとの簡単なマージ

この例では、Persons という名前のインライン テーブルに 3 つの行がロードされています。次に、Merge はテーブルを次のように変更します。

* 行 (Mary, 4) を追加します。
* 行 (Steven, 3) を削除します
* 番号 5 を Jake に割り当てます。

[LastChangeDate] 変数は、[マージ] が実行された後、[ChangeDate] 列の最大値に設定されます。

### ロード スクリプト

アプリケーションにスクリプト例を追加して実行します。結果を表示するには、結果列に含まれている項目をアプリケーションのシートに追加します。

```
Set DateFormat='D/M/YYYY';
Persons:
load * inline [
Name, Number
Jake, 3
Jill, 2
Steven, 3
];

Merge (ChangeDate, LastChangeDate) on Name Concatenate(Persons)
LOAD * inline [
Operation, ChangeDate,   Name,     Number
Insert,    1/1/2021,     Mary,     4
Delete,    1/1/2021,     Steven, 
Update,    2/1/2021,     Jake,     5
];
```

インライン ロードの使用の詳細については、「[インライン ロードを使用したデータのロード](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/inline-loads-qs.htm)」を参照してください。

### 結果

Merge Loadの前は、結果のテーブルは次のように表示されます。

Resulting table

| Name | Number |
| --- | --- |
| Jake | 3 |
| Jill | 2 |
| Steven | 3 |

MergeLoadの後、テーブルは次のように表示されます:

Resulting table

| ChangeDate | Name | Number |
| --- | --- | --- |
| 2/1/2021 | Jake | 5 |
| - | Jill | 2 |
| 1/1/2021 | Mary | 4 |

データがロードされると、[データのロード進行状況] ダイアログ ボックスに実行された操作が表示されます。

[データのロード進行状況] ダイアログ ボックス

![\[データのロード進行状況\] ダイアログ ボックス。](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Resources/Images/ui_gen_data_load_merge.png)

## 例 2: フィールドが欠落しているデータ ロード スクリプト

この例では、上記と同じデータがロードされますが、現在では各人のIDが含まれます。

Mergeはテーブルを以下のように変更します:

* 行 (Mary, 4) を追加します。
* 行 (Steven, 3) を削除します
* 番号 5 を Jake に割り当てます
* 番号 6 を Jill に割り当てます。

### ロード スクリプト

ここでは、２つのMerge Loadステートメントを使用します。１つは「Insert」と「Delete」用で、もう１つは「Update」用です。

アプリケーションにスクリプト例を追加して実行します。結果を表示するには、結果列に含まれている項目をアプリケーションのシートに追加します。

```
Set DateFormat='D/M/YYYY';
Persons:
Load * Inline [
PersonID, Name, Number
1, Jake, 3
2, Jill, 2
3, Steven, 3
];

Merge (ChangeDate, LastChangeDate) on PersonID Concatenate(Persons)
Load * Inline [
Operation, ChangeDate,   PersonID, Name,     Number
Insert,    1/1/2021,     4,        Mary,     4
Delete,    1/1/2021,     3,        Steven, 
];

Merge (ChangeDate, LastChangeDate) on PersonID Concatenate(Persons)
Load * Inline [
Operation, ChangeDate,   PersonID, Number
Update,    2/1/2021,     1,        5
Update,    3/1/2021,     2,        6
];
```

### 結果

MergeLoadステートメントの後、テーブルは次のように表示されます:

Resulting table

| PersonID | ChangeDate | Name | Number |
| --- | --- | --- | --- |
| 1 | 2/1/2021 | Jake | 5 |
| 2 | 3/1/2021 | Jill | 6 |
| 4 | 1/1/2021 | Mary | 4 |

2番目のMergeステートメントにはフィールドのNameが含まれていないため、その結果、名前が変更されていないことに注意してください。

## 例 3: データ ロード スクリプト - ChangeDate を使用した Where 句による部分的なリロード

次の例では、Only引数は、Mergeコマンドが部分的なリロード中にのみ実行されることを指定しています。更新は、以前にキャプチャされた [LastChangeDate] に基づいてフィルタリングされます。Merge が終了すると、LastChangeDate 変数には、マージ中に処理された ChangeDate 列の最大値が割り当てられます。

### ロード スクリプト

```
Merge Only (ChangeDate, LastChangeDate) on Name Concatenate(Persons)
LOAD Operation, ChangeDate,  Name, Number 
from [lib://ChangeFilesFolder/BulkChangesInPersonsTable.csv] (txt)
where ChangeDate >='$(LastChangeDate)';
```

## 詳細を見る

* [部分的なリロード](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/PartialReload.htm)
* [Load](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Load.htm)
* [Concatenate](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/concatenate.htm)
* [Map](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Map.htm)
* [Only](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/Only.htm)