2013-10-07 69 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的合并的内容。

相关问题