跳到主要內容

使用 Join 與 Keep 來合併表格

在此頁面

使用 JoinKeep 來合併表格

聯結是將兩個表格結合成一個表格的操作。產生的表格記錄是原始表格記錄的組合,通常以這種方式在所產生表格中形成任何指定組合的兩個記錄,會具有一或數個通用欄位的通用值,也稱為「自然聯結」。在 Qlik Sense 中,可在指令碼中建立聯結,進而產生邏輯表。

可聯結已在指令碼中的表格。之後,Qlik Sense 邏輯不會看到個別的表格,而是聯結的結果,亦即單一的內部表格。在某些情況下這是必要的,但會有一些缺點:

  • 載入的表格通常會變得較大,使得 Qlik Sense 運作較慢。
  • 某些資訊可能會遺失:原始表格內的頻率 (記錄筆數) 可能不再可用。

Keep 功能可將兩個表格的其中一個或兩個都先減少到表格資料的交集,然後才儲存到 Qlik Sense 中,這是專門設計用來減少需要使用明確聯結的情況。

備註: 本手冊中的「聯結」一詞通常指的是內部表格建立之前所進行的聯結。不過,在內部表格建立之後所進行的關聯基本上也算是聯結。

Join

進行聯結的最簡單方式,是在指令碼中使用 Join 前置詞,如此會將內部表格聯結到另一個具名的表格,或是聯結到上一個建立的表格。這樣的聯結算是外部聯結,會從兩個表格建立所有可能的值組合。

範例:  

LOAD a, b, c from table1.csv; join LOAD a, d from table2.csv;

產生的內部表格會有欄位 abcd。而記錄筆數會視這兩個表格的欄位值而定。

備註: 要聯結之欄位的名稱必須完全相同。要聯結的欄位數目可任意。通常表格應會有一個或數個通用欄位。若無通用欄位,則會呈現表格的笛卡兒座標的乘積。也可能所有欄位都是通用的,但這通常毫無意義。除非 Join 陳述式中指定先前已載入表格的表格名稱,否則 Join 前置詞會使用上一個建立的表格。因此,兩個陳述式的順序不可任意排序。

如需詳細資訊,請參閱Join

使用 Join

Qlik Sense 指令碼語言中明確的 Join 前置詞會執行兩個表格的完整聯結。結果會是一個表格。這樣的聯結通常會產生非常大的表格。

  1. 開啟進階指令碼教學課程應用程式。
  2. 資料載入編輯器中新增新的指令碼區段。
  3. 叫用區段 Transactions
  4. 在右側功能表的 DataFiles 之下,按一下選取資料

  5. 上傳然後選取 Transactions.csv
  6. 提示: 欄位名稱下,確保已選取內嵌欄位名稱,以便載入資料時包含表格欄位的名稱。
  7. 從以下項目選取資料視窗中,按一下插入指令碼
  8. 上傳然後選取 Salesman.xlsx
  9. 從以下項目選取資料視窗中,按一下插入指令碼
  10. 您的指令碼應如下所示:

    LOAD "Transaction ID", "Salesman ID", Product, "Serial No", "ID Customer", "List Price", "Gross Margin" FROM [lib://DataFiles/Transactions.csv] (txt, codepage is 28591, embedded labels, delimiter is ',', msq); LOAD "Salesman ID", Salesman, "Distributor ID" FROM [lib://DataFiles/Salesman.xlsx] (ooxml, embedded labels, table is Salesman);

  11. 按一下載入資料
  12. 開啟資料模型檢視器。資料模型應如下所示:
  13. 資料模型:TransactionsSalesmanProduct 表格

    資料模型、交易、銷售人員和產品表格。

不過,讓 TransactionsSalesman 表格分離可能不是所需結果。這可能比聯結兩個表格更好。

  1. 若要設定聯結表格的名稱,在第一個 LOAD 陳述式之上新增下列行:
  2. Transactions:

  3. 若要聯結 TransactionsSalesman 表格,在第二個 LOAD 陳述式之上新增下列行:
  4. Join(Transactions)

    您的指令碼應如下所示:

    Transactions: LOAD     "Transaction ID",     "Salesman ID",     Product,     "Serial No",     "ID Customer",     "List Price",     "Gross Margin" FROM [lib://DataFiles/Transactions.csv] (txt, codepage is 28591, embedded labels, delimiter is ',', msq);  Join(Transactions) LOAD     "Salesman ID",     Salesman,     "Distributor ID" FROM [lib://DataFiles/Salesman.xlsx] (ooxml, embedded labels, table is Salesman);

  5. 按一下載入資料
  6. 開啟資料模型檢視器。資料模型應如下所示:
  7. 資料模型: TransactionsProduct 表格

    加入後的資料模型。

    TransactionsSalesman 表格中的所有欄位現已合併成為單一的 Transactions 表格。

備註: 若要進一步瞭解使用 Join 的時機,請在 Qlik Community 中參閱這些部落格貼文:To Join or not to Join (是否要聯結)Mapping as an Alternative to Joining (作為替代選項對應聯結)。 行為會在 QlikView 的上下文中討論。不過,邏輯同樣適用於 Qlik Sense

Keep

Qlik Sense 的其中一個主要特色是可在表格之間建立關聯而不是聯結,這可降低所佔的記憶體空間、提高速度,並帶來極大的靈活性。Keep 功能是專門用來減少需要使用明確聯結的情況。

兩個 LOADSELECT 陳述式之間的 Keep 前置詞,可將這兩個表格的其中一個或兩個都先減少到表格資料的交集,然後才儲存到 Qlik Sense 中。Keep 前置詞前面一律必須加上 InnerLeftRight 前置詞的其中一個。從表格選取記錄的方式和對應聯結所使用的方式相同。不過,兩個表格並未聯結,而是以兩個個別的具名表格儲存在 Qlik Sense 中。

如需詳細資訊,請參閱 Keep

Inner

在資料載入指令碼語言中,JoinKeep 前置詞的前面可以加上 Inner 前置詞。

若加在 Join 之前,是指定兩個表格之間的聯結必須為內部聯結。產生的表格僅會包含兩個表格之間,具備兩邊完整資料集的組合。

若加在 Keep 之前,是指定兩個表格應先減少到其共同交集,然後才儲存到 Qlik Sense 中。

範例:  

在此範例中,我們使用來源表格 Table1Table2

請注意,這些只是範例。在 Qlik Sense 中沒有要完成的附帶活動。

Table 1
A B
1 aa
2 cc
3 ee
Table2
A C
1 xx
4 yy

Inner Join

首先,我們會在表格上執行 Inner Join,產生 VTable,僅包含一個列,存在於兩個表格中的唯一記錄,擁有從兩個表格合併的資料。

VTable: SELECT * from Table1; inner join SELECT * from Table2;

VTable
A B C
1 aa xx

Inner Keep

如果我們改而執行 Inner Keep,仍然會有兩個表格。兩個表格是透過通用欄位 A 建立關聯。

VTab1: SELECT * from Table1; VTab2: inner keep SELECT * from Table2;

VTab1
A B
1 aa
VTab2
A C
1 xx

如需詳細資訊,請參閱Inner

Left

在資料載入指令碼語言中,JoinKeep 前置詞的前面可以加上 left 前置詞。

若加在 Join 之前,是指定兩個表格之間的聯結必須為左方聯結。產生的表格僅會包含兩個表格之間,具備第一個表格完整資料集的組合。

若加在 Keep 之前,是指定第二個表格應先減少到與第一個表格的共同交集,然後才儲存到 Qlik Sense 中。

範例:  

在此範例中,我們使用來源表格 Table1Table2

Table1
A B
1 aa
2 cc
3 ee
Table2
A C
1 xx
4 yy

首先,我們會在表格上執行 Left Join,產生 VTable,包含來自 Table1 的所有列,合併 Table2 中符合列的欄位。

VTable: SELECT * from Table1; left join SELECT * from Table2;

VTable
A B C
1 aa xx
2 cc -
3 ee -

如果我們改而執行 Left Keep,仍然會有兩個表格。兩個表格是透過通用欄位 A 建立關聯。

VTab1: SELECT * from Table1; VTab2: left keep SELECT * from Table2;

VTab1
A B
1 aa
2 cc
3 ee
VTab2
A C
1 xx

如需詳細資訊,請參閱Left

Right

Qlik Sense 指令碼語言中,JoinKeep 前置詞的前面可以加上 right 前置詞。

若加在 Join 之前,是指定兩個表格之間的聯結必須為右方聯結。產生的表格僅會包含兩個表格之間,具備第二個表格完整資料集的組合。

若加在 Keep 之前,是指定第一個表格應先減少到與第二個表格的共同交集,然後才儲存到 Qlik Sense 中。

範例:  

在此範例中,我們使用來源表格 Table1Table2

Table1
A B
1 aa
2 cc
3 ee
Table2
A C
1 xx
4 yy

首先,我們會在表格上執行 Right Join,產生 VTable,包含來自 Table2 的所有列,合併 Table1 中符合列的欄位。

VTable: SELECT * from Table1; right join SELECT * from Table2;

VTable
A B C
1 aa xx
4 - yy

如果我們改而執行 Right Keep,仍然會有兩個表格。兩個表格是透過通用欄位 A 建立關聯。

VTab1: SELECT * from Table1; VTab2: right keep SELECT * from Table2;

VTab1
A B
1 aa
VTab2
A C
1 xx
4 yy

如需詳細資訊,請參閱Right