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

create new field based on multiple resident tables

鉴于多个常驻 tables,我想根据不同 tables 中的字段创建一个新字段。

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 有 ~1M 行,table2 ~1K 行,table3 ~10 行。我想创建一个新字段,或者添加到 table1 或者可能添加到由 id1 链接的新 table 中,结果是:

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 table 做到这一点,那么 3 就不起作用。

真实数据包括这个新字段的七个 table(很多外键)。数据从 QVD 加载(数据在多个 QVW 之间共享),非常类似于 SQL 数据库; table 中的 none 是逐行冗余的,因此将 db table 组合成单个 QVD table 可能效率低下。 (再加上一次 table 刷新数据非常容易。)一位同事建议我将每个 QVD 加载到一个巨大的 table 中,但这似乎不对(我也没有成功地链接了几个 tables)。

在 win10-x64 上使用 QV 12.0 桌面在 QVS 上部署。

您的加入方式是错误的,QlikView 只能在加入后处理结果,而不是在处理过程中,因此您将不得不执行另一个驻留加载以将值连接到 Newval 中。 drop table 命令很重要,否则你会得到大量无意的 syn tables

newtable:
left join (table1)
load * resident table2; drop table 2;

Resulttable:
load id1,
val1&val2 as NewVal
resident newtable; drop newtable;

@TheBudac's 是其中的一部分,但它只合并了三个中的两个。大多数问题都源于不正确的 multi-table 连接。我的困惑在于 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;

这产生了这些 table:

这棵树:

快速浏览:

  1. 因为我用的是left join,所以我从最大的table开始;其他连接将规定不同的起始条件要求。在我的例子中,table1 代表最大的,所以我从那个开始:

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

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

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

    用第三个和更多 table 重复,始终加入 against temptable 与新的 table.

  3. 现在我们使用那个临时 table 来创建我们新的 table。您可以选择使用此数据来扩充 table1(当然可行),但对我来说,因为我正在生成几个新的计算字段(此处未显示),所以将它们在逻辑上分开是有意义的。

    newtable:
    load id1a as id1,
      val1a & val2a & val3a as newval
    resident temptable;
    
    drop table temptable;
    

    请注意,我将相关键重命名回其原始值,以便此 table 正确链接到 table。删除临时 table 有助于清理,但保留它无害(这样做有助于 debugging/learning)。