对于您希望从另一个值中查找单个值的简单查找,您可以使用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;