我试图在INST列上加入KDB中的两个表 .
src lj `INST xkey map
结果表应该只返回在表(大约300,000行)src(大约600,000行)和表src(大约2,000行)中具有INST的行,但它返回src中每行的行 .
我做错了什么,如何修复它以正确加入?
使用 ij 而不是 lj . lj 与SQL的左连接基本相同 . ij 与SQL 's inner join, which seems to be what you'重新查找基本相同 .
ij
lj
我想你想要这个:
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
等同于SQL语句:
select * from map Left join src ON map.INST = [src].INST
如果您还只想要不同的行,那么您可能需要以下内容:
以来
对于表,distinct返回不同的行
http://code.kx.com/q/ref/search/#distinct
正如Adam所说,您还必须小心使用相同名称的列,这些列不用于创建连接 .
我认为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
现在:
q)src ij map INST| src.b map.b map.c ----| ----------------- 1 | a 1 x 3 | c 2 y 4 | d 3 z
缺少INST = 2,因为它不存在于两个表中,但是从两个表中获取每列 .
希望这是你需要的 .
3 回答
使用
ij
而不是lj
.lj
与SQL的左连接基本相同 .ij
与SQL 's inner join, which seems to be what you'重新查找基本相同 .我想你想要这个:
见下面的解释 .
lj的行为符合预期:它从左表中获取每一行,然后连接右表中的其他值,其中键控列上存在匹配 . 如果没有匹配,则在该行中追加空值 . 例如 .
ij(内连接)将排除键控列上没有匹配的行:
q-sql语句:
等同于SQL语句:
如果您还只想要不同的行,那么您可能需要以下内容:
以来
http://code.kx.com/q/ref/search/#distinct
正如Adam所说,您还必须小心使用相同名称的列,这些列不用于创建连接 .
我认为ij不适合你的原因是因为src和map有其他具有相同名称的列 .
以此架构为例:
在这些上执行ij:
在这里我们可以看到结果从map表中获取了b的值 .
要解决此问题,您可以重命名每个表中的列以表示其源表,但要加入的列除外 .
你可以使用这个功能:
要编辑表格:
现在:
缺少INST = 2,因为它不存在于两个表中,但是从两个表中获取每列 .
希望这是你需要的 .