KDB / q:如何用包含不同列的行更新表?

时间:2019-09-02 04:11:37

标签: kdb

我正在尝试使用辅助表/行(B)更新表(A),如下所示:

table:()
row:([]x:`val1;)

table upsert row
table insert row

当所有后续行都具有相同的架构时,这可以工作。 但是,我试图解决的一个极端情况与后续行可能具有不同架构的情况有关,即:

row:([]x:`val1;y:`val2)

以上内容引发了mismatch错误,这是预料之中的。 如何修改上述插入/插入逻辑,以解决采用其他架构的更新的出现?

2 个答案:

答案 0 :(得分:3)

首先按照问题中所述的操作顺序进行操作,而无需在表上使用`指定upsert:

`表更新行

或将其再次分配给它本身,第二个操作将不起作用并抛出类型错误,因为无法将行插入到空列表中。

要进一步创建一个具有单例行的表而又不会引发排名错误的操作,则需要列出列的值:

row:([] x:`val1;y:`val2)
'rank
  [6]  row:([] x:`val1;y:`val2)
               ^
row:([] x:enlist `val1;y:enlist `val2)
x    y
---------
val1 val2

现在要回答您的问题。

要能够在不同模式下插入或插入行,建议使用@ terrylynch的蛮力方法是使用Union Join(uj),其中 该表将需要分配回自身或分配给新变量。此操作实质上创建了两个表的超集。 请注意,第一次连接完成后,空列表的类型将提升为表:

row:([] x:enlist `val1;y:enlist `val2)
table:()
row1:([] x:enlist `val1)
table:table uj row1
table:table uj row

table
x    y
---------
val1
val1 val2

应该注意的是,一旦将附加列插入表中,则在键入该列时,只能将symbol类型的数据插入该列中。通常,这是一件好事,因为在类型列上运行查询和操作比在非类型列上运行要快得多。

meta table
c| t f a
-| -----
x| s
y| s

如果您要能够动态地将不同类型的数据插入到表中,则可以创建一个空表,该表具有这样的无类型列:

table:([] a:0N 0N;b:(();())

table
a b
---


meta table
c| t f a
-| -----
a| j
b|

在b列中需要空列表的空记录(正弦记录)是为了确保Q不会按插入值的类型键入列表。

要在此空模式中“插入”:

`table upsert row1
`table

table
a b
------
  ()
  ()
1 `ABB

meta table
c| t f a
-| -----
a| j
b|

通常注意,当插入具有上述指定为动态模式的表时,或者以其他方式代替插入单例表时,将行指定为列表/混合列表,其中每个元素表示元素类型与列类型。

table:([] a:0N 0N;b:(();()))

`table insert (1;`ABB)
,2

`table insert (1;"h")
,3

`table insert (1;3)
,4

table
a b
------
  ()
  ()
1 `ABB
1 "h"
1 3

meta table
c| t f a
-| -----
a| j
b|

答案 1 :(得分:2)

您可以使用联合联接

q)table uj row
x    y
---------
val1
val1 val2

此处记录:https://code.kx.com/v2/ref/uj/