基于多个驻留表创建新字段

r2e*_*ans 0 join qlikview

给定多个驻留表,我想基于不同表中的字段创建一个新字段.

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)

没有错误,但没有newtablenewval.

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上进行部署.

r2e*_*ans 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;
Run Code Online (Sandbox Code Playgroud)

这产生了这些表格:

在此输入图像描述

而这棵树:

在此输入图像描述

快速浏览:

  1. 因为我正在使用left join,我从最大的表开始; 其他联接将决定不同的起始条件要求.在我的情况下,table1代表最大,所以我从那开始:

    temptable:
    load id1 as id1a, val1 as val1a
    resident table1;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 每个连接都应该针对我们正在处理的临时表.重命名变量很重要,因此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新表.

  3. 现在我们使用该临时表来创建新表.您可以选择table1使用此数据进行扩充(当然可行),但对我而言,因为我生成了几个新的计算字段(此处未显示),因此将它们保持逻辑分离是有意义的.

    newtable:
    load id1a as id1,
      val1a & val2a & val3a as newval
    resident temptable;
    
    drop table temptable;
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,我将相关键重命名为其原始值,以便此表正确链接到table.删除临时表有助于清理事务,但保留它并没有坏处(这样做有助于调试/学习).