给定多个驻留表,我想基于不同表中的字段创建一个新字段.
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
];
Run Code Online (Sandbox Code Playgroud)
为了参数,假设table1有~1M行,table2~1K行和table3~10行.我想创建一个新字段,该字段可以添加到table1或者可能在链接的新表中id1,从而导致:
id1 val1 newval
a1 car1 car1type1mfr1
a2 car2 car2type2mfr2
Run Code Online (Sandbox Code Playgroud)
努力:
newtable:
load val1 & val2 & val3 as newval;
Run Code Online (Sandbox Code Playgroud)
没有错误,但没有newtable或newval.
newtable:
left join (table2)
load val1&val2 as newval resident table1;
Run Code Online (Sandbox Code Playgroud)
Errs with Field not found - <val2>.(显然我想扩展这个包括table3,但是如果我不能用2个表做,那么3就行不通.
真实数据包括这个新字段的七个表(许多外键).数据从QVD加载(数据在多个QVW之间共享),非常模仿SQL数据库; 没有一个表是行冗余的,因此将db表组合到单个QVD表中可能效率低下.(另外一次刷新数据非常简单.)一位同事建议我将每个QVD加载到一个巨大的表中,但这似乎不对(即使是几个表也没有成功链接到).
在win10-x64上使用QV 12.0桌面在QVS上进行部署.
@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;
Run Code Online (Sandbox Code Playgroud)
这产生了这些表格:
而这棵树:
快速浏览:
因为我正在使用left join,我从最大的表开始; 其他联接将决定不同的起始条件要求.在我的情况下,table1代表最大,所以我从那开始:
temptable:
load id1 as id1a, val1 as val1a
resident table1;
Run Code Online (Sandbox Code Playgroud)每个连接都应该针对我们正在处理的临时表.重命名变量很重要,因此Qlik不会创建不必要的合成键.
left join (temptable)
load id2 as id2a, id1 as id1a, val2 as val2a
resident table2;
Run Code Online (Sandbox Code Playgroud)
使用resident非常重要,因为它不会重新查询(SQL)或重新加载(QVD或其他文件).
重复与第三,进一步的表,总是加入对 temptable新表.
现在我们使用该临时表来创建新表.您可以选择table1使用此数据进行扩充(当然可行),但对我而言,因为我生成了几个新的计算字段(此处未显示),因此将它们保持逻辑分离是有意义的.
newtable:
load id1a as id1,
val1a & val2a & val3a as newval
resident temptable;
drop table temptable;
Run Code Online (Sandbox Code Playgroud)
请注意,我将相关键重命名为其原始值,以便此表正确链接到table.删除临时表有助于清理事务,但保留它并没有坏处(这样做有助于调试/学习).