0

在 QlikView 中,我有一个表Data和一个数据库表A。表A应使用两次(A_LeftA_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 文件中?

感谢您的帮助一个想法。

4

2 回答 2

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 只能在您希望将单个值映射到表中时使用。对于更多字段,如果您希望将结果组合到单个表中,则需要使用 a 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'    ];

然后,这将使用一个名为“Data”的表,然后您可以将其输出到 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;
于 2014-05-06T23:09:48.680 回答
0

要回答最后一部分,可以使用CONCATENATE函数将一个表的内容附加到另一个表中,即

Final:
Load *
from
   Table1

CONCATENATE

Load *
from
   Table2

将为您提供一个名为 Final 的表格,其中包含 Table1 和 Table2 的合并内容。

于 2013-10-11T08:21:30.163 回答