マージ
Merge プレフィックスをスクリプト内の任意の LOAD または SELECT ステートメントに追加して、ロードされたテーブルを別のテーブルに統合する必要があることを指定できます。また、このステートメントを部分的なリロードで実行する必要があることも指定します。
一般的な使用例は、変更ログをロードし、これを使用して inserts、updates、deletes を既存のテーブルに適用する場合です。
[リロード] ボタンを使用して部分的なリロードを実行します。詳細については、「ボタン」を参照してください。Qlik Engine JSON API を使用することもできます。
構文:
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 に割り当てます。
演算
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 に変更します。2番目のステートメントは F2 を変更しませんが、その代わり、ターゲット テーブルに値を残します。