Join kdb左连接问题

Join kdb左连接问题,join,left-join,kdb,Join,Left Join,Kdb,我正在尝试连接列INST上KDB中的两个表 src lj `INST xkey map 结果表应该只返回在表(大约300000行)src(大约600000行)和表src(大约2000行)中都有INST的行,但它为src中的每一行返回行 我做错了什么?如何修复它以正确加入?使用ij而不是ljlj本质上与SQL的左连接相同ij本质上与SQL的内部连接相同,这似乎就是您要寻找的 我认为ij不适合您的原因是src和map有其他同名列 以这个模式为例: q)src:([INST:1 2 3 4] b:`

我正在尝试连接列INST上KDB中的两个表

src lj `INST xkey map
结果表应该只返回在表(大约300000行)src(大约600000行)和表src(大约2000行)中都有INST的行,但它为src中的每一行返回行


我做错了什么?如何修复它以正确加入?

使用
ij
而不是
lj
lj
本质上与SQL的左连接相同
ij
本质上与SQL的内部连接相同,这似乎就是您要寻找的

我认为ij不适合您的原因是src和map有其他同名列

以这个模式为例:

q)src:([INST:1 2 3 4] b:`a`b`c`d)
q)map:([INST:1 3 4] b:`1`2`3;c:`x`y`z)
在这些设备上执行ij:

q)src ij map
INST| b c
----| ---
1   | 1 x
3   | 2 y
4   | 3 z
这里我们可以看到,结果从map表中获取了b的值

为了解决这个问题,您可以重命名每个表中的列,以表示它们的源表,但要连接的列除外

您可以使用此功能:

q)rename_cols:{[tbl_name;key_col;cur_col] if[key_col~cur_col;:cur_col]; :`$tbl_name,".",(string cur_col) }
要编辑表格,请执行以下操作:

q)src:(rename_cols["src";`INST;] each cols src) xcol src;
q)map:(rename_cols["map";`INST;] each cols map) xcol map;
q)src
INST| src.b
----| -----
1   | a
2   | b
3   | c
4   | d
q)map
INST| map.b map.c
----| -----------
1   | 1     x
3   | 2     y
4   | 3     z
现在:

INST=2缺失,因为它不存在于两个表中,但您可以从两个表中获得每一列

希望这就是您所需要的。

我想您需要这个:

distinct map lj `INST xkey src
见下面的解释

“它为src中的每一行返回行。”

lj的行为与预期的一样:它从左表中获取每一行,然后从右表中的附加值进行连接,其中键控列上存在匹配项。如果没有匹配项,则在该行中追加空值。例如

q)show t1: ([]sym:`GOOG`AAPL`MSFT; size: 3?100.; quant: 3?1000)
sym  size     quant
-------------------
GOOG 40.66642 908
AAPL 17.80839 360
MSFT 30.17723 522
q)show t2: ( [sym:`GOOG`MSFT] currency: `EUR`USD )
sym | currency
----| --------
GOOG| EUR
MSFT| USD
q)t1 lj t2
sym  size     quant currency
----------------------------
GOOG 40.66642 908   EUR
AAPL 17.80839 360
MSFT 30.17723 522   USD
ij(内部联接)将排除键控列上不匹配的行:

q)t1 ij t2
sym  size     quant currency
----------------------------
GOOG 40.66642 908   EUR
MSFT 30.17723 522   USD
q-sql语句:

map lj `INST xkey src
select * from map Left join src ON map.INST = [src].INST
与SQL语句等效:

map lj `INST xkey src
select * from map Left join src ON map.INST = [src].INST
如果您也只需要不同的行,则可能需要以下内容:

distinct map lj `INST xkey src

对于表,distinct返回不同的行


正如Adam所说,您还必须小心使用名称相同的列,这些列不用于创建联接。

这仍然不会返回我需要的结果。我正在尝试复制此SQL代码
从map Left join src ON map.INST=[src].INST
@simon major