kdb:通过复合外键连接两个表的惯用方法是什么?
kdb: What's the idiomatic way to join two tables by a composite foreign key?
我有两个 tables 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
到 table t1
.
我查看了如何加入这两个 table 的文档,但没有成功。有没有直接的方式加入他们?不过,我采用了以下方法:
ej[`t1;update t1:`t1$(a,'b) from t1;t2]
> a b x y t1 c z
> --------------
基本上在扩展 table t1
后在 tables t1
和 t2
之间进行相等连接以公开复合外键,即列类型t1
。有没有更惯用和更简单的方法?例如做 t2 ij t1
导致 error: ``a
一种稍微更有效和更简洁的方法是利用 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
我有两个 tables 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
到 table t1
.
我查看了如何加入这两个 table 的文档,但没有成功。有没有直接的方式加入他们?不过,我采用了以下方法:
ej[`t1;update t1:`t1$(a,'b) from t1;t2]
> a b x y t1 c z
> --------------
基本上在扩展 table t1
后在 tables t1
和 t2
之间进行相等连接以公开复合外键,即列类型t1
。有没有更惯用和更简单的方法?例如做 t2 ij t1
导致 error: ``a
一种稍微更有效和更简洁的方法是利用 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