kdb使用另一个表中的数据更新整个列

时间:2014-10-03 14:44:32

标签: kdb q-lang

我有两个分区表。表A是我的主表,表B中的列是表A中某些列的精确副本。但是,表B中有一列有我需要的数据 - 因为表A中的匹配列已满无效。

我想彻底摆脱表B,因为大部分都是冗余的,并使用表B中一列的数据更新表A中的匹配列。

在视觉上,

 Table A:                Table B:
 a     b     c    d      a    b    d
 __________________     ______________
 1    null   11   A      1   joe   A
 2    null   22   B      2   bob   B
 3    null   33   C      3   sal   C

我想用表B中b列的值填充表A中的b列,然后我不再需要表B并可以删除它。我将不得不反复这样做,因为这两张表每天都是从两个不同的来源给我的。

我无法锁定这些表,因为它们都是分区的。

我试过了:

 update columnb:(exec columnb from TableB) from TableA; 

但是我得到了一个`长度错误。

对于如何以任何方式处理此问题的建议表示赞赏。

1 个答案:

答案 0 :(得分:1)

要替换内存中的列,您可以执行以下操作。

t1:([]a:1 2 3;b:0N)
a b
---
1
2
3

t2:([]c:`aa`bb`cc;b:5 6 7)
c  b
----
aa 5
bb 6
cc 7


t1,'t2
a b c
------
1 5 aa
2 6 bb
3 7 cc

如果您收到长度错误,则列没有 相同的计数和以下将解决它。显而易见的 这个解决方案的问题是它将开始重复 如果t2的列数较低,则为t1。你必须找出原因。

t1,'count[t1]#t2

现在对于分区,您将使用修改功能进行更改 分区表的b列,表A,日期2007.02.23(或您的分区所在的任何日期)。 这将tableB的b列加载到内存中以执行修改。您必须对每个分区执行修改。

@[`:2007.02.23/tableA/;`b;:;count[tableA]#exec b from select b from tableB where date=2007.02.23]