Join kdb左连接问题
我正在尝试连接列INST上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:`
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