Kdb 创建一个空表,从另一个表中获取列名

Kdb 创建一个空表,从另一个表中获取列名,kdb,Kdb,我们有两张桌子“t”和“s”。 这些表可能有数据,也可能没有数据,但t和s的模式总是相同的 Tables: q)t:([] id:("ab";"cd";"ef";"gh";"ij"); refid:("";"ab";"";"ef";""); typ:`BUY`SELL`BUY`SELL`BUY) q)s:t / For example purpose 现在,在我的功能中。我想连接这两个表的输出并返回它,为此我使用名为res的变量 问题是最初res是空的,不是98h类型,因此,如果我尝试将t或s

我们有两张桌子“t”和“s”。
这些表可能有数据,也可能没有数据,但t和s的模式总是相同的

Tables:
q)t:([] id:("ab";"cd";"ef";"gh";"ij"); refid:("";"ab";"";"ef";""); typ:`BUY`SELL`BUY`SELL`BUY)
q)s:t / For example purpose
现在,在我的功能中。我想连接这两个表的输出并返回它,为此我使用名为res的变量

问题是最初res是空的,不是98h类型,因此,如果我尝试将t或s连接到res,那么它将失败(这是显而易见的)

解决这个问题的一个方法是为res创建一个空模式(与t和s表相同),它可以完美地工作

q){res:([] id:(); refid:(); typ:`$());$[not ((count res) ~ 0); res: res,t ; res:t ]; $[not ((count res) ~ 0); res: res,s ; res:s ]; :res}[]

但是,有没有一种方法可以让我们不必在所有列之前为res创建空模式,而是将res分配为null(空)表,当t或s与res连接时,该表可以获得与t或s相同的模式。

您的示例并不完全清楚-您提到
res
已存在于注释中,但随后声明“最初res为空,不是98h型”

如果您只想在res不存在的情况下将其分配为空表,则可以使用系统命令检查res是否已在根命名空间中定义,如下所示:

f:{
  if[not res in system"a";res:()]
  $[count res;res,:t;res:t]; 
  $[count res;res,:s;res:s]; 
  :res;
 };

将res分配为0,并使用有问题的架构

q)t:([] id:("ab";"cd";"ef";"gh";"ij"); refid:("";"ab";"";"ef";""); typ:`BUY`SELL`BUY`SELL`BUY)
q)res:0#t
q)meta res
c    | t f a
-----| -----
id   |
refid|
typ  | s
因此,在这种情况下,您可以执行以下操作

q){[]res:0#t;if[count res;res,:t];$[count res;res,:s;res:s]}[]

您不想只使用res:t,s有什么具体原因吗?是的,因为在我的完整代码中,res数据在从函数返回res数据之前被使用、处理和过滤。如果res已经是一个现有变量,那么听起来您肯定不想将其重新定义为空表,不?不,res不是existing变量。谢谢,这是我一直在寻找的。空列表可以附加一个表。'res:()'是我想要理解的。
系统
调用通常会受到权限限制,并且会阻止多线程。检查是否定义了它的更好方法是
()~key`res
。这通常也是一种更快的操作。
q){[]res:0#t;if[count res;res,:t];$[count res;res,:s;res:s]}[]