我有两个表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
定义了一个外键[{1}}。
我查看了文档如何加入这两个表,但没有运气。是否有一种直接的方式加入他们?我按照以下方式制定了:
t1
在扩展表ej[`t1;update t1:`t1$(a,'b) from t1;t2]
> a b x y t1 c z
> --------------
之后,基本上在表t1
和t2
之间进行相等的连接,以暴露复合外键,即列类型t1
。有更惯用和更简单的方法吗?例如,执行t1
会导致t2 ij t1
答案 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