2013-10-07 104 views
0

在QlikView中,我有一個表數據和一個數據庫表A。表A應該使用兩次(A_Left,A_Right)。 (表A可以有成千上萬個條目。)在QlikView中使用查找表的最佳方式是什麼?

我負載腳本是:

A_Left: 
Load a_id_left, 
    a_name_left 
inline [ 
    a_id_left, a_name_left 
    1, 'nwsnd' 
    2, 'dcsdcws' 
    3, 'fsdf' ]; 

A_Rigtht: 
Load a_id_right, 
    a_name_right 
inline [ 
    a_id_right, a_name_right 
    1, 'nwsnd' 
    2, 'dcsdcws' 
    3, 'fsdf' ]; 

Data: 
Load id, 
    a_id_left, 
    a_name_left as 'Name_Left', 
    a_id_right, 
    a_name_right as 'Name_Right', 
    data 
inline [ 
    id, a_id_left, a_right_id, data 
    1, 1, 2, 37 
    1, 1, 3, 18 
    1, 2, 3, 62 
]; 

所以我的問題是:什麼是使用QlikView的查找表的最佳方式? (我應該使用MAPPING和/或ApplyMap爲什麼會這樣快嗎??)

一個問題的另一部分是:它是否有助於從星改變數據結構表? (我知道這會花費更多的內存。)順便說一下:我怎樣才能把所有的數據放在一張表 中,這樣我就可以將它完全存儲在一個QVD文件中?

謝謝你的建議。

回答

1

對於您希望從您可以使用MAPPING負荷,然後用ApplyMap()功能的另一個值查找一個值簡單的查找。例如,說我有如下表:

LOAD 
    * 
INLINE [ 
    UserID, System 
    1, Windows 
    2, Linux 
    3, Windows 
]; 

我有一個包含用戶名和用戶名如下另一個表:

LOAD 
    * 
INLINE [ 
    UserID, UserName 
    1, Alice 
    2, Bob 
    3, Carol 
]; 

然後我就可以用ApplyMap結合上面的表格如下:

UserNameMap: 
MAPPING LOAD 
    * 
INLINE [ 
    UserID, UserName 
    1, Alice 
    2, Bob 
    3, Carol 
]; 

SystemData: 
LOAD 
    UserID, 
    ApplyMap('UserNameMap', UserID, 'MISSING') as UserName, 
    System 
INLINE [ 
    UserID, System 
    1, Windows 
    2, Linux 
    3, Windows 
]; 

ApplyMap速度非常快,不會顯着減慢加載時間(儘管速度不如直接QVD加載速度快)。 但是,如上所述,ApplyMap只能用於如果您希望將單個值值映射到您的表中。如果您希望將結果合併到一個表中,則需要更多字段,則需要使用join(與SQL JOIN類似)。

如果您不希望將它們加入單個表格(但將其保留爲「明星」方案),只需確保您希望鏈接的字段命名相同即可。例如:

A_Left: 
Load a_id_left, 
    a_name_left as [Name_Left] 
inline [ 
    a_id_left, a_name_left 
    1, 'nwsnd' 
    2, 'dcsdcws' 
    3, 'fsdf' ]; 

A_Rigtht: 
Load a_id_right, 
    a_name_right as [Name_Right] 
inline [ 
    a_id_right, a_name_right 
    1, 'nwsnd' 
    2, 'dcsdcws' 
    3, 'fsdf' ]; 

Data: 
Load id, 
    a_id_left, 
    a_id_right, 
    data 
inline [ 
    id, a_id_left, a_right_id, data 
    1, 1, 2, 37 
    1, 1, 3, 18 
    1, 2, 3, 62 
]; 

(我已刪除「名稱」字段從「數據」,因爲這將無法加載)。

由於QlikView的自動字段關聯性,這將在您的QlikView文檔中工作。

但是,如果您希望將數據存儲在單個表中(例如,輸出到QVD),那麼在你的情況下,你將需要JOIN你的兩張表變成Data。我們可以重新排列了一些表來讓我們的生活更容易一點,如果我們首先把你的Data表,我們就可以加入你的其他兩個表上:

Data: 
Load id, 
    a_id_left, 
    a_id_right, 
    data 
inline [ 
    id, a_id_left, a_id_right, data 
    1, 1, 2, 37 
    1, 1, 3, 18 
    1, 2, 3, 62 
]; 

LEFT JOIN (Data) 
Load a_id_left, 
    a_name_left as [Name_Left] 
inline [ 
    a_id_left, a_name_left 
    1, 'nwsnd' 
    2, 'dcsdcws' 
    3, 'fsdf' ]; 

LEFT JOIN (Data) 
Load a_id_right, 
    a_name_right as [Name_Right] 
inline [ 
    a_id_right, a_name_right 
    1, 'nwsnd' 
    2, 'dcsdcws' 
    3, 'fsdf' ]; 

這將然後再打名爲單個表「數據「,然後你可以輸出到QVD等。

你可能想考慮優化你的」表A「提取,因爲它幾乎被加載兩次,這可能需要一些時間(例如從長途服務器等)因此一次抓取數據然後在內存中切片(更快)可能會更好。一個簡單的例子可能如下:

TableA: 
LOAD 
    a_id_left, 
    a_id_right, 
    a_name_left, 
    a_name_right 
FROM ...; 

Data: 
Load id, 
    a_id_left, 
    a_id_right, 
    data 
inline [ 
    id, a_id_left, a_id_right, data 
    1, 1, 2, 37 
    1, 1, 3, 18 
    1, 2, 3, 62 
]; 

LEFT JOIN (Data) 
LOAD DISTINCT 
    a_id_left, 
    a_name_left as [Name_Left] 
RESIDENT TableA; 

LEFT JOIN (Data) 
LOAD DISTINCT 
    a_id_right, 
    a_name_right as [Name_Right] 
RESIDENT TableA; 

DROP TABLE TableA; 
0

回答最後一個部分,你可以使用CONCATENATE函數,一個表中的內容附加到anoher,即

Final: 
Load * 
from 
    Table1 

CONCATENATE 

Load * 
from 
    Table2 

會給你一個表,稱爲最終以表1和表2的合併的內容。

相關問題