加入使用场景

Join usage scenarios

官方docs只介绍了join的基本用法。但是可以看到左连接 lj 是如何实现的:

q)lj
k){.Q.ft[,\:[;y];x]}
q).Q.ft
k){$[$[99h=@t:v y;98h=@. t;0];[n:#+!y;n!x 0!y];x y]}

所以可以找到另一个用例 (dict,keyed table):

/(dict,dict): add columns
d1:     `a`b  ! 1 2
d2:       `b`c!   3 4
(d1,d2)~`a`b`c! 1 3 4

/(table,table): add rows
t1:(enlist `a`b!1 2)
t2:(enlist `a`b!3 4)
(t1,t2) ~ (`a`b!1 2;`a`b!3 4)

/(keyed table,keyed table): add rows
k1:(`a`b!1 2;`a`b!3 5)!(`c`d`e!10 20 30;`c`d`e!40 50 60)
k2:(`a`b!1 2;`a`b!3 4)!(`c`d`e!15 25 35;`c`d`e!45 55 65)
(k1,k2)
/ a b| c  d  e
/ ---| --------
/ 1 2| 15 25 35
/ 3 5| 40 50 60
/ 3 4| 45 55 65

/(dict,keyed table): add cols
k2:(`a`b!1 2;`a`b!3 4)!(`c`d`e!15 25 35;`c`d`e!45 55 65)
/                  a b| c  d  e
/                  ---| --------
d1:     `a`b`c`d  !1 2  10 20
/                  1 2| 15 25 35
/                  3 4| 45 55 65
(d1,k2)~`a`b`c`d`e!1 2  15 25 35

文档中也提到了 ,\:,' 的情况。但是知道表格是变相的字典列表,它们只是上面列出的那些的派生词。

问题是 - 这个强大的函数 join , 是否还有其他用例(具有不同的参数类型)?

您已经涵盖了 q 中的主要数据结构,但我认为还有一种方法最初对新用户可能并不明显,即给定函数首先是 q 中的 class 个对象,您可以使用 join on它们,这对于创建解析树很有用。

例如,

t:([]col1:10?10;col2:10?10;col3:10?10)

假设您正在使用一个函数查询,并且您想要 select 分别计算 col1 和 col2 的总和,您可以这样写

?[t;();0b;`col1`col2!((sum;`col1);(sum;`col2))]

虽然稍微更紧凑,但包含的列越多,它就会变得越紧凑

?[t;();0b;`col1`col2!sum,/:`col1`col2]

下面又更短了,但不是因为使用了连接

?[t;();0b;{x!sum,/:x}`col1`col2]