使用 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。
Keep
資料載入指令碼中明確的 Join 前置詞會執行兩個表格的完整聯結。結果會是一個表格。在許多情況下,這樣的聯結會產生非常大的表格。Qlik Sense 的其中一個主要特色是可在表格之間建立關聯而不是聯結,這可降低所佔的記憶體空間、提高速度,並帶來極大的靈活性。Keep 功能是專門用來減少需要使用明確聯結的情況。
兩個 LOAD 或 SELECT 陳述式之間的 Keep 前置詞,可將這兩個表格的其中一個或兩個都先減少到表格資料的交集,然後才儲存到 Qlik Sense 中。Keep 前置詞前面一律必須加上 Inner、Left 或 Right 前置詞的其中一個。從表格選取記錄的方式和對應聯結所使用的方式相同。不過,兩個表格並未聯結,而是以兩個個別的具名表格儲存在 Qlik Sense 中。
如需詳細資訊,請參閱 Keep。
Inner
在資料載入指令碼語言中,Join 和 Keep 前置詞的前面可以加上 Inner 前置詞。
若加在 Join 之前,是指定兩個表格之間的聯結必須為內部聯結。產生的表格僅會包含兩個表格之間,具備兩邊完整資料集的組合。
若加在 Keep 之前,是指定兩個表格應先減少到其共同交集,然後才儲存到 Qlik Sense 中。
範例:
在此範例中,我們使用來源表格 Table1 與 Table2:
A | B |
---|---|
1 | aa |
2 | cc |
3 | ee |
A | C |
---|---|
1 | xx |
4 | yy |
Inner Join
首先,我們會在表格上執行 Inner Join,產生 VTable,僅包含一個列,存在於兩個表格中的唯一記錄,擁有從兩個表格合併的資料。
VTable:
SELECT * from Table1;
inner join SELECT * from Table2;
A | B | C |
---|---|---|
1 | aa | xx |
Inner Keep
如果我們改而執行 Inner Keep,您仍然會有兩個表格。兩個表格是透過通用欄位 A 建立關聯。
VTab1:
SELECT * from Table1;
VTab2:
inner keep SELECT * from Table2;
A | B |
---|---|
1 | aa |
A | C |
---|---|
1 | xx |
如需詳細資訊,請參閱 Inner。
Left
在資料載入指令碼語言中,Join 和 Keep 前置詞的前面可以加上 left 前置詞。
若加在 Join 之前,是指定兩個表格之間的聯結必須為左方聯結。產生的表格僅會包含兩個表格之間,具備第一個表格完整資料集的組合。
若加在 Keep 之前,是指定第二個表格應先減少到與第一個表格的共同交集,然後才儲存到 Qlik Sense 中。
範例:
在此範例中,我們使用來源表格 Table1 與 Table2:
A | B |
---|---|
1 | aa |
2 | cc |
3 | ee |
A | C |
---|---|
1 | xx |
4 | yy |
首先,我們會在表格上執行 Left Join,產生 VTable,包含來自 Table1 的所有列,合併 Table2 中符合列的欄位。
VTable:
SELECT * from Table1;
left join SELECT * from Table2;
A | B | C |
---|---|---|
1 | aa | xx |
2 | cc | - |
3 | ee | - |
如果我們改而執行 Left Keep,您仍然會有兩個表格。兩個表格是透過通用欄位 A 建立關聯。
VTab1:
SELECT * from Table1;
VTab2:
left keep SELECT * from Table2;
A | B |
---|---|
1 | aa |
2 | cc |
3 | ee |
A | C |
---|---|
1 | xx |
如需詳細資訊,請參閱 Left。
Right
在資料載入指令碼語言中,Join 和 Keep 前置詞的前面可以加上 right 前置詞。
若加在 Join 之前,是指定兩個表格之間的聯結必須為右方聯結。產生的表格僅會包含兩個表格之間,具備第二個表格完整資料集的組合。
若加在 Keep 之前,是指定第一個表格應先減少到與第二個表格的共同交集,然後才儲存到 Qlik Sense 中。
範例:
在此範例中,我們使用來源表格 Table1 與 Table2:
A | B |
---|---|
1 | aa |
2 | cc |
3 | ee |
A | C |
---|---|
1 | xx |
4 | yy |
首先,我們會在表格上執行 Right Join,產生 VTable,包含來自 Table2 的所有列,合併 Table1 中符合列的欄位。
VTable:
SELECT * from Table1;
right join SELECT * from Table2;
A | B | C |
---|---|---|
1 | aa | xx |
4 | - | yy |
如果我們改而執行 Right Keep,您仍然會有兩個表格。兩個表格是透過通用欄位 A 建立關聯。
VTab1:
SELECT * from Table1;
VTab2:
right keep SELECT * from Table2;
A | B |
---|---|
1 | aa |
A | C |
---|---|
1 | xx |
4 | yy |
如需詳細資訊,請參閱 Right。