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

时间:2017-10-30 10:24:23

标签: kdb

我有两个表t1t2定义为:

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定义了属性ab的复合主键。 t2为表t1定义了一个外键[{1}}。

我查看了文档如何加入这两个表,但没有运气。是否有一种直接的方式加入他们?我按照以下方式制定了:

t1

在扩展表ej[`t1;update t1:`t1$(a,'b) from t1;t2] > a b x y t1 c z > -------------- 之后,基本上在表t1t2之间进行相等的连接,以暴露复合外键,即列类型t1。有更惯用和更简单的方法吗?例如,执行t1会导致t2 ij t1

1 个答案:

答案 0 :(得分:2)

稍微高效一点更简洁的方法是利用kdb表中隐藏的i列(即行索引),而不是生成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语句中使用外键,如:

select t1.a,t1.b,t1.x,t1.y,c,z from t2

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

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