在QlikView中,我有一个表数据和一个数据库表 A 。表 A 应使用两次( A_Left , A_Right )。 (表A可以包含数千个条目。)
我的加载脚本是:
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文件中?
感谢您提供帮助。
答案 0 :(得分:1)
对于您希望从另一个值中查找单个值的简单查找,您可以使用MAPPING
加载,然后使用ApplyMap()
函数。例如,假设我有下表:
LOAD
*
INLINE [
UserID, System
1, Windows
2, Linux
3, Windows
];
我有另一个包含UserID和UserName的表,如下所示:
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' ];
表放在第一位,我们就可以加入另外两张表:
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;
然后在一个名为“Data”的表中求助,然后输出到QVD等。
您可能希望考虑优化“表A”提取,因为它几乎被加载两次,这可能需要一些时间(例如来自长途服务器等),因此最好一次性获取数据然后在内存中切片(更快)。一个简单的例子可能如下所示:
{{1}}
答案 1 :(得分:0)
要回答最后一部分,您可以使用CONCATENATE函数将一个表的内容追加到另一个表中,即
Final:
Load *
from
Table1
CONCATENATE
Load *
from
Table2
将为您提供一个表,名为Final,其中包含Table1和Table2的合并内容。