类似于 kdb 中的表的实用程序

Utility like except for tables in kdb

因为我们有 except 函数用于 kdb 中的列表以查找存在于一个列表中而不存在于另一个列表中的元素,类似地我们是否有任何实用程序来提取存在于一个 table 中而不存在于另一个列表中的行另一个基于列?

例如:我有两个 tables:

l:([]c1:`a`b`c`d;c2:10 20 30 40)
r:([]c1:`a`a`a`b`b;c3:100 200 300 400 50)

因为,对于 table l 中的 c1 列,我们有 c d 行,它不存在于 table r.
的 c1 列中 我们在 kdb 中是否有任何实用程序可用于获取如下所示的输出?

c1 c2
-----
c  30
d  40

我使用 -

获得了输出
select from l where c1 in l[`c1] except r`c1

但是,我正在搜索 better/optimised solution/utility 以获得相同的输出。

我认为您当前的实现没有任何问题,但您可以在键控 table 上使用 drop(又名 _)以获得更简洁的方法:

q)#[1#`c1;r]_1!l
c1| c2
--| --
c | 30
d | 40

当 "key" 多于一列时,这也很整洁:

l0:([]c0:`x`y`z`w;c1:`a`b`c`d;c2:10 20 30 40)
r0:([]c0:`y`x`x`x`y;c1:`a`a`a`b`b;c3:100 200 300 400 50)

q)#[`c0`c1;r0]_2!l0
c0 c1| c2
-----| --
z  c | 30
w  d | 40

一个更实用的形式是这样的:

{cl:cols[x]inter cols y;x where not(cl#x)in cl#y}[l;r]
c1 c2
-----
c  30
d  40

如果您不知道要匹配的列,这应该有效,因为开始时 cols[x] inter cols[y] 获取两个表之间的公共列。它也可以在没有键控列的情况下工作。

虽然在这种特定情况下,以下会快一点:

l where not l[`c1] in r[`c1]