kdb:用复合外键连接两个表的惯用方法是什么?

kdb:用复合外键连接两个表的惯用方法是什么?,kdb,Kdb,我有两个表t1和t2,定义如下: t1:([a:`datetime$(); b:`$()] x:`float$(); y:`float$()); meta t1 > c| t f a > -| ----- > a| z > b| s > x| f > y| f t2:([t1:`t1$(); c:`$()] z:`float$()); meta t2 > c | t f a > --| ------ > t1|

我有两个表t1和t2,定义如下:

t1:([a:`datetime$(); b:`$()] x:`float$(); y:`float$());
meta t1
> c| t f a
> -| -----
> a| z    
> b| s    
> x| f    
> y| f 

t2:([t1:`t1$(); c:`$()] z:`float$());
meta t2
> c | t f  a
> --| ------
> t1| i t1  
> c | s     
> z | f 
其中t1根据属性a和b定义复合主键。t2定义表t1的forein键t1

我已经查阅了所有关于如何连接这两个表的文档,但没有找到运气。有没有一条捷径可以加入他们?不过,我是这样想的:

ej[`t1;update t1:`t1$(a,'b) from t1;t2]
> a b x y t1 c z
> --------------

基本上,在扩展表t1以公开复合外键(即列类型t1)之后,在表t1和t2之间进行相等联接。有没有更地道、更简单的方法?例如,执行t2ij t1会导致错误:`a

执行此操作的更有效和更简洁的方法是使用隐藏的i列,即kdb表中的行索引,而不是生成t1的键列的组合,并针对t1进行枚举,例如

q)ej[`t1;update t1:`t1!i from t1;t2]
a b x y t1 c z
--------------
这稍微更有效率:

q)\ts:1000 ej[`t1;update t1:`t1!i from t1;t2]
11 1904
q)\ts:1000 ej[`t1;update t1:`t1$(a,'b) from t1;t2]
12 2256
当然,填充表会提高效率

编辑:

另一个选项是在select语句中使用外键,例如:

从t2中选择t1.a、t1.b、t1.x、t1.y、c、z

这比使用实际联接要高效得多:

q)\ts:1000 select t1.a,t1.b,t1.x,t1.y,c,z from t2
2 1712
q)\ts:1000 ej[`t1;update t1:`t1!i from t1;t2]
12 2496
这里的缺点是必须命名select语句中的所有字段

涉及连接的另一个选项是使用t2中的t1列索引到t1,然后连接每个记录。要执行此操作,您必须使用0!要取消索引表,请执行以下操作:

q)((0!t1)@(0!t2)`t1),'t2
t1 c  | a                       b   x         y        z
------| -------------------------------------------------------
0  gck| 2004.02.13T15:53:44.342 ndd 4.49731   7.833686 9.030751
1  job| 2001.07.22T05:29:31.118 hpb 0.1392076 4.099561 7.750292
我添加了一些虚拟记录以供演示

这比select语句的效率稍低,但比ej更好:

q)\ts:1000 ((0!t1)@(0!t2)`t1),'t2
4 1920