给定多个驻留表,我想基于不同表中的字段创建一个新字段。
table1:
LOAD * INLINE [
id1,val1
a1,car1
a2,car1
];
table2:
LOAD * INLINE [
id2,id1,val2
b1,a1,type1
b2,a2,type2
];
table3:
LOAD * INLINE [
id3,id2,val3
c1,b1,mfr1
c2,b2,mfr2
];
为了论证,假设table1
有~100行,table2
~1K行和table3
~10行。我想创建一个新字段,该字段可以添加到table1
,也可以添加到id1
链接的新表中,从而产生:
id1 val1 newval
a1 car1 car1type1mfr1
a2 car2 car2type2mfr2
努力:
newtable:
load val1 & val2 & val3 as newval;
没有错误,但没有newtable
或newval
。
newtable:
left join (table2)
load val1&val2 as newval resident table1;
Field not found - <val2>
的错误。 (显然我想将其扩展到包括table3
,但是如果我不能用2个表做,那么3就不行。
真实数据包括这个新字段的七个表(许多外键)。数据从QVD加载(数据在多个QVW之间共享),非常模仿SQL数据库;没有一个表是行冗余的,因此将db表组合到单个QVD表中可能效率很低。 (另外一次刷新数据非常简单。)一位同事建议我将每个QVD加载到一个巨大的表中,但这似乎不对(即使是几个表也没有成功链接到)。
在win10-x64上使用QV 12.0桌面在QVS上部署。
答案 0 :(得分:5)
@ TheBudac是那里的一部分,但它只合并了三个中的两个。大多数问题都源于不正确的多表连接。我的困惑在于Qlik中的“join”语法;现在我知道发生了什么事情,但这对我来说是有意义的,但最初对我来说并不那么明显。
以下是最适合我的方式:
temptable:
load id1 as id1a, val1 as val1a
resident table1;
left join (temptable)
load id2 as id2a, id1 as id1a, val2 as val2a
resident table2;
left join (temptable)
load id2 as id2a, val3 as val3a
resident table3;
newtable:
load id1a as id1,
val1a & val2a & val3a as newval
resident temptable;
drop table temptable;
这产生了这些表格:
和这棵树:
快速浏览:
因为我正在使用left join
,所以我从最大的表开始;其他联接将决定不同的起始条件要求。就我而言,table1
代表了最大的,所以我从那开始:
temptable:
load id1 as id1a, val1 as val1a
resident table1;
每个联接都应该针对我们正在处理的临时表。重命名变量很重要,这样Qlik就不会创建不必要的合成密钥。
left join (temptable)
load id2 as id2a, id1 as id1a, val2 as val2a
resident table2;
使用resident
非常重要,因为它不会重新查询(SQL)或重新加载(QVD或其他文件)。
对第三个和更多表格重复,始终使用新表格加入 temptable
。
现在我们使用该临时表来创建新表。您可以选择用这些数据来增加table1
(当然可行),但对我而言,因为我生成了几个新的计算字段(此处未显示),所以将它们逻辑分开是有意义的。
newtable:
load id1a as id1,
val1a & val2a & val3a as newval
resident temptable;
drop table temptable;
请注意,我将相关密钥重命名为其原始值,以便此表正确链接到table
。删除临时表有助于清理事务,但保留它并没有坏处(这样做有助于调试/学习)。
答案 1 :(得分:1)
您的联接是错误的方式,QlikView只能在加入后才能处理结果,而不是在进程中,因此您必须执行另一个常驻加载以将值连接到Newval。 drop table命令很重要,否则最终会出现大量无意的syn表
newtable:
left join (table1)
load * resident table2; drop table 2;
Resulttable:
load id1,
val1&val2 as NewVal
resident newtable; drop newtable;