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

时间:2017-03-30 22:43:17

标签: 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
];

为了论证,假设table1有~100行,table2 ~1K行和table3 ~10行。我想创建一个新字段,该字段可以添加到table1,也可以添加到id1链接的新表中,从而产生:

id1  val1  newval
a1   car1  car1type1mfr1
a2   car2  car2type2mfr2

努力:

newtable:
load val1 & val2 & val3 as newval;

没有错误,但没有newtablenewval

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上部署。

2 个答案:

答案 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;

这产生了这些表格:

enter image description here

和这棵树:

enter image description here

快速浏览:

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

    temptable:
    load id1 as id1a, val1 as val1a
    resident table1;
    
  2. 每个联接都应该针对我们正在处理的临时表。重命名变量很重要,这样Qlik就不会创建不必要的合成密钥。

    left join (temptable)
    load id2 as id2a, id1 as id1a, val2 as val2a
    resident table2;
    

    使用resident非常重要,因为它不会重新查询(SQL)或重新加载(QVD或其他文件)。

    对第三个和更多表格重复,始终使用新表格加入 temptable

  3. 现在我们使用该临时表来创建新表。您可以选择用这些数据来增加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;