合併在此頁面
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 。
對於每個載入的記錄,會比較記錄識別碼與先前載入的記錄,只會保留最新記錄 (根據序號)。若以 Delete 標記最新記錄,將不會保留任何內容。
目標表格
要修改哪個表格由欄位組決定。若具有相同欄位組 (第一個欄位除外;操作) 的表格已存在,這將會是要修改的相關表格。或者,串連 前置詞可用來指定表格。若未決定目標表格,Merge LOAD 建構的結果會儲存在新的表格中。
若使用串連前置詞,產生的表格具有一組對應至現有表格聯集和要合併之輸入的欄位。因此,相較於作為要合併之輸入使用的變更記錄,目標表格可能會取得更多欄位。
部分載入會進行與完整載入相同的事項。差異是部分載入很少建立新的表格。除非您已使用 Only 子句,否則永遠存在具有相同欄位組 (來自先前指令碼執行) 的目標表格。
序號
若載入的變更記錄是累積記錄,亦即這包含已經載入的變更,則參數 SequenceNoVar 可用於 Where 子句,以限制輸入資料量。然後可以讓 Merge LOAD 僅載入記錄,其中欄位 SequenceNoField 大於 SequenceNoVar 。完成後,Merge LOAD 會將新的值指派至 SequenceNoVar ,並可在 SequenceNoField 欄位中看見最大值。
操作
Merge LOAD 可以有比目標表格更少的欄位。不同的操作以不同的方式處理遺失的欄位:
插入 :在 Merge LOAD 中遺失但存在於目標表格的欄位,會在目標表格中取得 NULL。
刪除 :遺失的欄位不會影響結果。仍會刪除相關記錄。
更新 :列於 Merge LOAD 的欄位會在目標表格中更新。不會變更遺失的欄位。這表示下列兩個陳述式不相同:
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,但會在目標表格中留下值。
範例
範例 1:與指定的表格簡單合併
在此範例中,載入了名為 Persons 的內嵌表格,其中含有三列。然後 Merge 會變更表格如下:
新增列 Mary, 4 。
刪除列 Steven, 3 。
將數字 5 指派至 Jake 。
執行 Merge 後,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
];
如需更多關於使用內嵌載入的資訊,請參閱 使用內嵌載入以載入資料 。
結果
在 Merge Load 之前,產生的表格顯示如下:
Resulting table
Name
Number
Jake
3
Jill
2
Steven
3
在 Merge Load 之後,表格顯示如下:
Resulting table
ChangeDate
Name
Number
2/1/2021
Jake
5
-
Jill
2
1/1/2021
Mary
4
載入資料時,資料載入進度 對話方塊會顯示執行的操作:
資料載入進度對話方塊
範例 2:含有遺失欄位的資料載入指令碼
在此範例中,會載入與上述相同的資料,但現在含有每個人的 ID。
Merge 會變更表格如下:
新增列 Mary, 4 。
刪除列 Steven, 3 。
將數字 5 指派至 Jake 。
將數字 6 指派至 Jill 。
載入指令碼
在此我們使用兩個 Merge Load 陳述式,一個用於「插入」和「刪除」,第二個用於「更新」。
將範例指令碼新增至您的應用程式並予以執行。若要查看結果,將結果資料行中列出的欄位新增至您應用程式中的工作表。
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
];
結果
在 Merge Load 陳述式之後,表格顯示如下:
Resulting table
PersonID
ChangeDate
Name
Number
1
2/1/2021
Jake
5
2
3/1/2021
Jill
6
4
1/1/2021
Mary
4
請注意,第二個 Merge 陳述式不包括欄位 Name ,因此尚未變更名稱。
範例 3:資料載入指令碼 - 使用 Where 子句與 ChangeDate 的部分載入
在以下範例中,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)';