# 使用 Join 和 Keep 結合表格

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

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

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

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

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

## SQL SELECT 陳述式內的聯結

使用某些 ODBC 驅動程式，可以在 SELECT 陳述式內進行聯結。這幾乎等同於使用 Join 前置詞進行聯結。

然而，大多數 ODBC 驅動程式無法進行完整 (雙向) 外部聯結。它們只能進行左或右外部聯結。左 (右) 外部聯結僅包含聯結鍵存在於左 (右) 表格中的組合。完整外部聯結包含任何組合。Qlik Sense 會自動進行完整外部聯結。

此外，在 SELECT 陳述式中進行聯結遠比在 Qlik Sense 中進行聯結複雜得多。

`SELECT DISTINCTROW` ` [Order Details].ProductID, [Order Details].  ` `UnitPrice, Orders.OrderID, Orders.OrderDate, Orders.CustomerID` `FROM Orders` `RIGHT JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID;`

此 SELECT 陳述式將包含虛構公司訂單的表格與包含訂單詳細資料的表格聯結。這是一個右外部聯結，這表示包含 OrderDetails 的所有記錄，也包含 OrderID 不存在於表格 Orders 中的記錄。然而，存在於 Orders 但不存在於 OrderDetails 中的訂單則不包含在內。

## 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)。

## Keep

資料 載入指令碼 中明確的 Join 前置詞會執行兩個表格的完整聯結。結果是一個表格。在許多情況下，這類聯結會產生非常大的表格。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：

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

資料載入指令碼中的 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)。