定义问题
定义的空表myt
myt:([] id:`int$(); score:`int$())例如,将一个或多个记录插入其中是很简单的。
`myt upsert `id`score!1 100但是,在定义要插入到给定表中的函数时,这似乎是另一个窍门。
第一次尝试版本可能是
upd:{[t] t upsert `id`score!42 314;}
upd[myt]显然,它只更新了一个本地版本的myt,什么也不更新。
可能解决办法的困难
可能的解决方案1:使用全局变量代替
让myt是一个全局变量,然后在函数中访问该变量。
upd:{`myt upsert `id`score!42 314;}
upd[]如果需要很多myt,它看起来是一个很好的解决方案。在这种情况下,必须为upd函数提供大量副本,如下所示
upd0:{`myt0 upsert `id`score!42 314;}
upd1:{`myt1 upsert `id`score!42 314;}
upd2:{`myt2 upsert `id`score!42 314;}
...所以,全局变量解在这里不是一个很好的解。
可能的解决方案2:修改表的外部功能
还可以通过在函数外部修改myt,通过删除结束的;返回修改后的结果来解决这个问题。
upd:{[t] t upsert `id`score!42 314} / return inserted valued
myt:upd[myt]它起作用了!但是在运行这段代码数百万次之后,它的工作速度越来越慢。因为这个解决方案放弃了upsert操作符的“就地”属性,所以随着表的大小越来越大,复制开销也会增加。
通过引用来传递论点?
也许这里的“通过引用”解决方案的概念。或者,对于这个问题,Q有自己的解决方案,但我还没有得到基本的想法。
通过在按名调用中添加"`“来更新已解决的问题
正如cillianreilly回答的那样,添加一个"" symbol in front ofmyt`“来将它作为全局变量传递到函数中是很简单的,所以完美的解决方案是直接的。
upd:{[t] t upsert `id`score!42 314;}
upd[`myt] / it works发布于 2022-11-13 04:08:38
你的第一个版本应该能实现你想要的。如果将表名作为符号传递,它将更新全局变量并返回表名。如果您传递表本身,它将返回您可以在赋值中使用的更新表,正如您在可能的解决方案2中所发现的那样。请注意,实际的表不会被此操作更新。
q){[t;x]t upsert x}[myt;`id`score!42 314]
id score
--------
42 314
q)count myt
0
q){[t;x]t upsert x}[`myt;`id`score!42 314]
`myt
q)count myt
1对于可能的解决方案1,为什么需要数百个myt表?无论如何,不需要将表名硬编码到函数中。您可以将表名作为上面演示的符号传递,这将为您更新全局信息。在其github上给出的官方kdb滴答示例正是在这种情况下使用插入,但实际上许多开发人员使用上插。https://github.com/KxSystems/kdb-tick/blob/master/tick/r.q#L6
希望这能有所帮助。
https://stackoverflow.com/questions/74418260
复制相似问题