Join
join 前置詞能夠將載入的表格與現有的具名表格或先前最後建立的資料表聯結。
聯結資料的效果是透過一組額外的欄位或屬性 (即目標表格中尚未存在的欄位或屬性) 來擴充目標表格。來源資料集與目標表格之間任何共同的欄位名稱,都會用來計算如何關聯新傳入的記錄。這通常稱為「自然聯結」。Qlik 聯結作業可能會導致產生的目標表格擁有比開始時更多或更少的記錄,這取決於聯結關聯的唯一性以及所採用的聯結類型。
聯結類型
有四種聯結類型:
-
Left join
-
Inner join
-
Outer join
-
Right join
來自不同類型聯結作業的範例結果集

Left join
Left join 是最常見的聯結類型。例如,如果您有一個交易資料集,並希望將其與參考資料集結合,您通常會使用 Left Join。您會先載入交易表格,然後載入參考資料集,同時透過 Left Join 前置詞將其聯結至已載入的交易表格上。Left Join 會保持所有交易不變,並在找到相符項目時加上補充的參考資料欄位。
Left join

Inner join
當您有兩個資料集,且只關心有相符關聯的任何結果時,請考慮使用 Inner Join。如果找不到相符項目,這將會從載入的來源資料和目標表格中消除所有記錄。因此,這可能會讓您的目標表格記錄比聯結作業發生前更少。
Inner join

Outer join (預設)
當您需要同時保留目標記錄和所有傳入記錄時,請使用 Outer Join。在找不到相符項目的情況下,每組記錄仍會保留,而聯結另一側的欄位將保持未填入 (null)。
如果省略類型關鍵字,預設的聯結類型為 outer join。
Outer join

Right join
此聯結類型會保留所有即將載入的記錄,同時將聯結目標表格中的記錄減少為僅在傳入記錄中有相符關聯的記錄。這是一種利基聯結類型,有時用作將已預先載入的記錄表格縮減為所需子集的方法。
Right join

Cross join
來自「cross join」作業的範例結果集

語法和引數
[inner | outer | left | right ]Join [ (tablename ) ]( loadstatement | selectstatement )
| 引數 | 描述 |
|---|---|
| tablename | 要與所載入表格比較的具名表格。 |
| loadstatement或 selectstatement | 已載入表格的 LOAD 或 SELECT 陳述式。 |
相關主題
這些主題可協助您使用此函數:
| 主題 | 說明 |
|---|---|
| 使用 Join 與 Keep 來合併表格 | 此主題提供「聯結」和「保留」資料集概念的進一步說明。 |
| Keep | Keep 載入前置詞類似於 Join 前置詞,但它不會結合來源和目標資料集。相反地,它會根據採用的作業類型 (inner、outer、left 或 right) 縮減每個資料集。 |
載入指令碼範例 - Left join
Left join 會保留主 (目標) 表格中的所有記錄,並從第二個 (來源) 表格新增相符的資料。如果來源中沒有相符項目,主表格的記錄仍會出現,但來源表格的欄位會是空白的。
將範例指令碼新增至您的應用程式並予以執行。若要查看結果,將結果資料行中列出的欄位新增至您應用程式中的工作表。
載入指令碼
Table1:
Load * inline [
Column1, Column2
A, B
1, aa
2, cc
3, ee ];
Table2:
Left Join Load * inline [
Column1, Column3
A, C
1, xx
4, yy ]; 如需有關使用內嵌載入的詳細資訊,請參閱 使用內嵌載入以載入資料。
結果
| Column1 | Column2 | Column3 |
|---|---|---|
| A | B | C |
| 1 | aa | xx |
| 2 | cc | - |
| 3 | ee | - |
此範例示範 Left Join 輸出,其中僅聯結存在於第一個 (左) 表格中的值。
概觀
假設您有一份訂單清單,但並非所有訂單都有相符的客戶記錄。
載入指令碼
Orders:
Load * inline [
OrderID, CustomerID, Amount
1, 101, 200
2, 102, 150
3, 104, 400
];
Customers:
Left Join (Orders)
Load * inline [
CustomerID, Name
101, Alice
102, Bob
103, Carol
];結果
如果您在資料模型檢視器中展開預覽視窗,您將會看到組織成表格的完整結果集的一部分:
|
OrderID |
CustomerID | Amount | Name |
|---|---|---|---|
|
1 |
101 | 200 | Alice |
|
2 |
102 | 150 | Bob |
|
3 |
104 | 400 | - |
OrderID 1 和 2 有相符的客戶。 OrderID 3 沒有相符的客戶,因此 Name 為空白。
概觀
開啟資料載入編輯器並將下面的載入指令碼新增至新的區段。
載入指令碼包含:
-
代表變更記錄的資料集,載入名為 Changes 的表格中。它包含 Status ID 索引鍵欄位。
-
代表變更狀態的第二個資料集,透過使用 left Join 載入前置詞將其聯結,以載入並與原始變更記錄結合。
此 left join 可確保變更記錄保持不變,同時在根據共同的 Status ID 找到傳入狀態記錄中的相符項目時,加上狀態屬性。
載入指令碼
Changes:
Load * inline [
Change ID Status ID Scheduled Start Date Scheduled End Date Business Impact
10030 4 19/01/2022 23/02/2022 None
10015 3 04/01/2022 15/02/2022 Low
10103 1 02/04/2022 29/05/2022 Medium
10185 2 23/06/2022 08/09/2022 None
10323 1 08/11/2022 26/11/2022 High
10326 2 11/11/2022 05/12/2022 None
10138 2 07/05/2022 03/08/2022 None
10031 3 20/01/2022 25/03/2022 Low
10040 1 29/01/2022 22/04/2022 None
10134 1 03/05/2022 08/07/2022 Low
10334 2 19/11/2022 06/02/2023 Low
10220 2 28/07/2022 06/09/2022 None
10264 1 10/09/2022 17/10/2022 Medium
10116 1 15/04/2022 24/04/2022 None
10187 2 25/06/2022 24/08/2022 Low
] (delimiter is '\t');
Status:
Left Join (Changes)
Load * inline [
Status ID Status Sub Status
1 Open Not Started
2 Open Started
3 Closed Completed
4 Closed Cancelled
5 Closed Obsolete
] (delimiter is '\t');結果
開啟資料模型檢視器並注意資料模型的形狀。只存在一個反正規化表格。它是所有原始變更記錄的組合,並將相符的狀態屬性聯結至每個變更記錄上。
|
Changes |
|---|
|
Change ID |
|
Status ID |
|
Scheduled Start Date |
|
Scheduled End Date |
|
Business Impact |
|
Status |
|
Sub Status |
如果您在資料模型檢視器中展開預覽視窗,您將會看到組織成表格的完整結果集的一部分:
|
Change ID |
Status ID | Scheduled Start Date | Scheduled End Date | Business Impact | Status | Sub Status |
|---|---|---|---|---|---|---|
|
10030 |
4 | 19/01/2022 | 23/02/2022 | None | Closed | Cancelled |
|
10031 |
3 | 20/01/2022 | 25/03/2022 | Low | Closed | Completed |
|
10015 |
3 | 04/01/2022 | 15/02/2022 | Low | Closed | Completed |
|
10103 |
1 | 02/04/2022 | 29/05/2022 | Medium | Open | Not Started |
| 10116 | 1 | 15/04/2022 | 24/04/2022 | None | Open | Not Started |
|
10134 |
1 | 03/05/2022 | 08/07/2022 | Low | Open | Not Started |
| 10264 | 1 | 10/09/2022 | 17/10/2022 | Medium | Open | Not Started |
|
10040 |
1 | 29/01/2022 | 22/04/2022 | None | Open | Not Started |
| 10323 | 1 | 08/11/2022 | 26/11/2022 | High | Open | Not Started |
| 10187 | 2 | 25/06/2022 | 24/08/2022 | Low | Open | Started |
| 10185 | 2 | 23/06/2022 | 08/09/2022 | None | Open | Started |
| 10220 | 2 | 28/07/2022 | 06/09/2022 | None | Open | Started |
| 10326 | 2 | 11/11/2022 | 05/12/2022 | None | Open | Started |
|
10138 |
2 | 07/05/2022 | 03/08/2022 | None | Open | Started |
| 10334 | 2 | 19/11/2022 | 06/02/2023 | Low | Open | Started |
由於 Status 表格中的第五列 (Status ID:'5',Status:'Closed',Sub Status:'Obsolete') 不對應於 Changes 表格中的任何記錄,因此此列中的資訊不會出現在上述結果集中。
返回資料載入編輯器。載入資料並開啟工作表。建立新的表格並將此欄位新增為維度: Status。
新增此量值:
=Count([Change ID])
現在您可以依 Status 檢查 Changes 的數量。
| Status | =Count([Change ID]) |
|---|---|
| Open | 12 |
| Closed | 3 |
載入指令碼範例 - Inner join
Inner join 僅保留存在於兩個表格中的記錄 (根據相符的欄位值)。
載入指令碼
將範例指令碼新增至您的應用程式並予以執行。若要查看結果,將結果資料行中列出的欄位新增至您應用程式中的工作表。
Table1:
Load * inline [
Column1, Column2
A, B
1, aa
2, cc
3, ee ];
Table2:
Inner Join Load * inline [
Column1, Column3
A, C
1, xx
4, yy ];如需有關使用內嵌載入的詳細資訊,請參閱 使用內嵌載入以載入資料。
結果
| Column1 | Column2 | Column3 |
|---|---|---|
| A | B | C |
| 1 | aa | xx |
此範例示範 Inner Join 輸出,其中僅聯結同時存在於第一個 (左) 和第二個 (右) 表格中的值。
概觀
您有訂單和已出貨訂單的清單。您只想要已出貨的訂單。
載入指令碼
Orders:
Load * inline [
OrderID, Amount
1, 200
2, 150
3, 400
];
Shipped:
Inner Join (Orders)
Load * inline [
OrderID, ShipDate
2, 2022-05-01
3, 2022-05-02
4, 2022-05-03
];結果
如果您在資料模型檢視器中展開預覽視窗,您將會看到組織成表格的完整結果集的一部分:
| OrderID | Amount | ShipDate |
|---|---|---|
| 2 | 150 | 2022-05-01 |
| 3 | 400 | 2022-05-02 |
只有 OrderID 2 和 3 出現,因為它們存在於兩個表格中。
概觀
開啟資料載入編輯器並將下面的載入指令碼新增至新的區段。
載入指令碼包含:
-
代表變更記錄的資料集,載入名為 Changes 的表格中。
-
代表源自來源系統 JIRA 之變更記錄的第二個資料集。透過使用 Inner Join 載入前置詞將其聯結,以載入並與原始記錄結合。
此 Inner Join 可確保僅保留在兩個資料集中都找到的五個變更記錄。
載入指令碼
Changes:
Load * inline [
Change ID Status ID Scheduled Start Date Scheduled End Date Business Impact
10030 4 19/01/2022 23/02/2022 None
10015 3 04/01/2022 15/02/2022 Low
10103 1 02/04/2022 29/05/2022 Medium
10185 2 23/06/2022 08/09/2022 None
10323 1 08/11/2022 26/11/2022 High
10326 2 11/11/2022 05/12/2022 None
10138 2 07/05/2022 03/08/2022 None
10031 3 20/01/2022 25/03/2022 Low
10040 1 29/01/2022 22/04/2022 None
10134 1 03/05/2022 08/07/2022 Low
10334 2 19/11/2022 06/02/2023 Low
10220 2 28/07/2022 06/09/2022 None
10264 1 10/09/2022 17/10/2022 Medium
10116 1 15/04/2022 24/04/2022 None
10187 2 25/06/2022 24/08/2022 Low
] (delimiter is '\t');
JIRA_changes:
Inner Join (Changes)
Load
[Ticket ID] AS [Change ID],
[Source System]
inline
[
Ticket ID Source System
10000 JIRA
10030 JIRA
10323 JIRA
10134 JIRA
10334 JIRA
10220 JIRA
20000 TFS
] (delimiter is '\t');結果
載入資料並開啟工作表。建立新的表格並將這些欄位新增為維度:
-
Source System
-
Change ID
-
Business Impact
現在您可以檢查五個產生的記錄。來自 Inner Join 的結果表格將僅包含在兩個資料集中具有相符資訊的記錄。
| Source System | Change ID | Business Impact |
|---|---|---|
| JIRA | 10030 | None |
| JIRA | 10134 | Low |
| JIRA | 10220 | None |
| JIRA | 10323 | High |
| JIRA | 10334 | Low |
載入指令碼範例 - Outer join
Outer join 會保留兩個表格中的所有記錄。在沒有相符項目的情況下,欄位會留白。
載入指令碼
將範例指令碼新增至您的應用程式並予以執行。若要查看結果,將結果資料行中列出的欄位新增至您應用程式中的工作表。
Table1:
Load * inline [
Column1, Column2
A, B
1, aa
2, cc
3, ee ];
Table2:
Outer Join Load * inline [
Column1, Column3
A, C
1, xx
4, yy ]; 如需有關使用內嵌載入的詳細資訊,請參閱 使用內嵌載入以載入資料。
結果
| Column1 | Column2 | Column3 |
|---|---|---|
| A | B | C |
| 1 | aa | xx |
| 2 | cc | - |
| 3 | ee | - |
| 4 | - | yy |
在此範例中,兩個表格 Table1 和 Table2 會合併為標記為 Table1 的單一表格。在這種情況下,通常會使用 outer 前置詞將多個表格聯結為單一表格,以對單一表格的值執行彙總。
概觀
您想要所有客戶和訂單的完整清單,即使某些客戶沒有訂單,且某些訂單沒有客戶記錄。
載入指令碼
Orders:
Load * inline [
OrderID, CustomerID
1, 101
2, 102
3, 104
];
Customers:
Outer Join (Orders)
Load * inline [
CustomerID, Name
101, Alice
102, Bob
103, Carol
];結果
如果您在資料模型檢視器中展開預覽視窗,您將會看到組織成表格的完整結果集的一部分:
| OrderID | CustomerID | Name |
|---|---|---|
| 1 | 101 | Alice |
| 2 | 102 | Bob |
| 3 | 104 | - |
| - | 103 | Carol |
OrderID 3 沒有相符的客戶 (Name 為空白)。
CustomerID 103 (Carol) 沒有相符的訂單 (OrderID 為空白)。
概觀
開啟資料載入編輯器並將下面的載入指令碼新增至新的區段。
載入指令碼包含:
-
代表變更記錄的資料集,載入名為 Changes 的表格中。
-
代表源自來源系統 JIRA 之變更記錄的第二個資料集,透過使用 Outer Join 載入前置詞將其聯結,以載入並與原始記錄結合。
這可確保保留兩個資料集中所有重疊的變更記錄。
載入指令碼
// 8 Change records
Changes:
Load * inline [
Change ID Status ID Scheduled Start Date Scheduled End Date Business Impact
10030 4 19/01/2022 23/02/2022 None
10015 3 04/01/2022 15/02/2022 Low
10138 2 07/05/2022 03/08/2022 None
10031 3 20/01/2022 25/03/2022 Low
10040 1 29/01/2022 22/04/2022 None
10134 1 03/05/2022 08/07/2022 Low
10334 2 19/11/2022 06/02/2023 Low
10220 2 28/07/2022 06/09/2022 None
] (delimiter is '\t');
// 6 Change records
JIRA_changes:
Outer Join (Changes)
Load
[Ticket ID] AS [Change ID],
[Source System]
inline
[
Ticket ID Source System
10030 JIRA
10323 JIRA
10134 JIRA
10334 JIRA
10220 JIRA
10597 JIRA
] (delimiter is '\t');結果
載入資料並開啟工作表。建立新的表格並將這些欄位新增為維度:
-
Source System
-
Change ID
-
Business Impact
現在您可以檢查 10 個產生的記錄。
| Source System | Change ID | Business Impact |
|---|---|---|
| JIRA | 10030 | None |
| JIRA | 10134 | Low |
| JIRA | 10220 | None |
| JIRA | 10323 | - |
| JIRA | 10334 | Low |
| JIRA | 10597 | - |
| - | 10015 | Low |
| - | 10031 | Low |
| - | 10040 | None |
| - | 10138 | None |
載入指令碼範例 - Right join
Right join 會保留來源表格中的所有記錄,並從目標表格新增相符的資訊。如果目標表格沒有相符項目,其欄位會是空白的。
載入指令碼
將範例指令碼新增至您的應用程式並予以執行。若要查看結果,將結果資料行中列出的欄位新增至您應用程式中的工作表。
Table1:
Load * inline [
Column1, Column2
A, B
1, aa
2, cc
3, ee ];
Table2:
Right Join Load * inline [
Column1, Column3
A, C
1, xx
4, yy ];如需有關使用內嵌載入的詳細資訊,請參閱 使用內嵌載入以載入資料。
結果
| Column1 | Column2 | Column3 |
|---|---|---|
| A | B | C |
| 1 | aa | xx |
| 4 | - | yy |
此範例示範 Right Join 輸出,其中僅聯結存在於第二個 (右) 表格中的值。
概觀
您的來源表格是客戶清單;您想要所有客戶,加上任何相符的訂單。
載入指令碼
Orders:
Load * inline [
OrderID, CustomerID
1, 101
2, 102
3, 104
];
Customers:
Right Join (Orders)
Load * inline [
CustomerID, Name
101, Alice
102, Bob
103, Carol
];結果
如果您在資料模型檢視器中展開預覽視窗,您將會看到組織成表格的完整結果集的一部分:
| CustomerID | Name | OrderID |
|---|---|---|
| 101 | Alice | 1 |
| 102 | Bob | 2 |
| 103 | Carol | - |
所有客戶都會出現。 Carol 沒有訂單 (OrderID 為空白)。
概觀
開啟資料載入編輯器並將下面的載入指令碼新增至新的區段。
載入指令碼包含:
-
代表變更記錄的資料集,載入名為 Changes 的表格中。
-
代表源自來源系統 Teamwork 之變更記錄的第二個資料集。透過使用 Right Join 載入前置詞將其聯結,以載入並與原始記錄結合。
這可確保僅保留 Teamwork 變更記錄,同時如果目標表格沒有相符的 Change ID,也不會遺失任何 Teamwork 記錄。
載入指令碼
Changes:
Load * inline [
Change ID Status ID Scheduled Start Date Scheduled End Date Business Impact
10030 4 19/01/2022 23/02/2022 None
10015 3 04/01/2022 15/02/2022 Low
10103 1 02/04/2022 29/05/2022 Medium
10185 2 23/06/2022 08/09/2022 None
10323 1 08/11/2022 26/11/2022 High
10326 2 11/11/2022 05/12/2022 None
10138 2 07/05/2022 03/08/2022 None
10031 3 20/01/2022 25/03/2022 Low
10040 1 29/01/2022 22/04/2022 None
10134 1 03/05/2022 08/07/2022 Low
10334 2 19/11/2022 06/02/2023 Low
10220 2 28/07/2022 06/09/2022 None
10264 1 10/09/2022 17/10/2022 Medium
10116 1 15/04/2022 24/04/2022 None
10187 2 25/06/2022 24/08/2022 Low
] (delimiter is '\t');
Teamwork_changes:
Right Join (Changes)
Load
[Ticket ID] AS [Change ID],
[Source System]
inline
[
Ticket ID Source System
10040 Teamwork
10015 Teamwork
10103 Teamwork
10031 Teamwork
50231 Teamwork
] (delimiter is '\t');結果
載入資料並開啟工作表。建立新的表格並將這些欄位新增為維度:
-
Source System
-
Change ID
-
Business Impact
現在您可以檢查五個產生的記錄。
| Source System | Change ID | Business Impact |
|---|---|---|
| Teamwork | 10015 | Low |
| Teamwork | 10031 | Low |
| Teamwork | 10040 | None |
| Teamwork | 10103 | Medium |
| Teamwork | 50231 | - |
疑難排解 - Cross join
概觀
如果您聯結兩個沒有相符欄位名稱的表格,第一個表格中的每一列將會與第二個表格中的每一列結合 — 可能會產生大量的記錄 (笛卡兒積),並導致非預期的資料關聯。
載入指令碼
TableA:
Load * inline [
A_ID, ValueA
1, foo
2, bar
];
TableB:
Join (TableA)
Load * inline [
B_ID, ValueB
10, baz
11, qux
];結果
如果您在資料模型檢視器中展開預覽視窗,您將會看到組織成表格的完整結果集的一部分:
| A_ID | ValueA | B_ID | ValueB |
|---|---|---|---|
| 1 | foo | 10 | baz |
| 1 | foo | 11 | qux |
| 2 | bar | 10 | baz |
| 2 | bar | 11 | qux |
每個 A_ID 都與每個 B_ID 配對 (共 4 列)。