# 使用 Join 與 Keep 來合併表格

聯結是將兩個表格結合成一個表格的操作。產生的表格記錄是原始表格記錄的組合，通常以這種方式在所產生表格中形成任何指定組合的兩個記錄，會具有一或數個通用欄位的通用值，也稱為「自然聯結」。在 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;
```

產生的內部表格會有欄位 a、b、c 及 d。而記錄筆數會視這兩個表格的欄位值而定。

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

如需詳細資訊，請參閱[Join](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Join.htm)。

## 使用 Join

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

請執行下列動作：

1. 開啟進階指令碼教學課程應用程式。

2. 在資料載入編輯器中新增新的指令碼區段。

3. 叫用區段 Transactions。

4. 在右側功能表的 DataFiles 之下，按一下選取資料。

5. 上傳然後選取 Transactions.csv。

   提示備註在欄位名稱下，確保已選取內嵌欄位名稱，以便載入資料時包含表格欄位的名稱。

6. 在 選取資料來源 視窗中，按一下 新增。

7. 上傳然後選取 Salesman.xlsx。

8. 在 選取資料來源 視窗中，按一下 新增。

   您的指令碼應如下所示：

   ```
   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);
   ```

9. 按一下載入資料。

10. 開啟資料模型檢視器。資料模型應如下所示：

    資料模型：Transactions、Salesman 和 Product 表格

    資料模型：Transactions、Salesman 和 Product 表格

    資料模型：TransactionsTransactions、SalesmanSalesman 和 ProductProduct 表格 ![資料模型、交易、銷售人員和產品表格。](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Resources/Images/ex_gen_Join1.png)

不過，讓 Transactions 和 Salesman 表格分離可能不是所需結果。這可能比聯結兩個表格更好。

請執行下列動作：

1. 若要設定聯結表格的名稱，在第一個 LOAD 陳述式之上新增下列行：
   ```
   Transactions:
   ```
2. 若要聯結 Transactions 和 Salesman 表格，在第二個 LOAD 陳述式之上新增下列行：
   ```
   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);
   ```
3. 按一下載入資料。
4. 開啟資料模型檢視器。資料模型應如下所示：

   資料模型： Transactions 和 Product 表格

   資料模型： Transactions 和 Product 表格

   資料模型： TransactionsTransactions 和 ProductProduct 表格 ![加入後的資料模型。](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Resources/Images/ex_gen_Join2.png)

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

資訊備註若要進一步瞭解何時使用Join，請參閱Qlik Community中的這些部落格文章：[要聯結還是不聯結](https://community.qlik.com/t5/Qlik-Design-Blog/To-Join-or-not-to-Join/ba-p/1463102)、[將對應作為聯結的替代方案](https://community.qlik.com/t5/Qlik-Design-Blog/Mapping-as-an-Alternative-to-Joining/bc-p/1473459)。 行為會在 QlikView 的上下文中討論。不過，邏輯同樣適用於 Qlik Sense。

## Keep

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

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

如需詳細資訊，請參閱[Keep](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Keep.htm)。

## Inner

在資料載入指令碼語言中，Join 和 Keep 前置詞的前面可以加上 Inner 前置詞。

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

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

範例：

在此範例中，我們使用來源表格 Table1 與 Table2。

請注意，這些只是範例。在 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](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Inner.htm)。

## Left

在資料載入指令碼語言中，Join 和 Keep 前置詞的前面可以加上 left 前置詞。

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

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

範例：

在此範例中，我們使用來源表格 Table1 與 Table2。

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](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Left.htm)。

## Right

在 Qlik Sense 指令碼語言中，Join 和 Keep 前置詞的前面可以加上 right 前置詞。

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

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

範例：

在此範例中，我們使用來源表格 Table1 與 Table2。

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](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Right.htm)。