我正在尝试使用辅助表/行(B)更新表(A),如下所示:
table:()
row:([]x:`val1;)
table upsert row
table insert row
当所有后续行都具有相同的架构时,这可以工作。 但是,我试图解决的一个极端情况与后续行可能具有不同架构的情况有关,即:
row:([]x:`val1;y:`val2)
以上内容引发了mismatch
错误,这是预料之中的。
如何修改上述插入/插入逻辑,以解决采用其他架构的更新的出现?
答案 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)