kdb离开加入问题

时间:2017-08-24 15:45:40

标签: join left-join kdb

我正在尝试在INST列中加入KDB中的两个表。

src lj `INST xkey map

结果表应该只返回在表(大约300,000行)src(大约600,000行)和表src(大约2,000行)中具有INST的行,但它返回src中每一行的行。

我做错了什么,如何修复它才能正常加入?

3 个答案:

答案 0 :(得分:1)

我想你想要这个:

distinct map lj `INST xkey src

见下面的解释。

  

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

lj的行为符合预期:它从左表中获取每一行,然后连接右表中的其他值,其中键控列上存在匹配。如果没有匹配,则在该行中追加空值。 E.g。

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 map lj `INST xkey src

因为

  

对于表,distinct返回不同的行

http://code.kx.com/q/ref/search/#distinct

正如亚当所说,你还必须小心使用相同名称的列来创建连接。

答案 1 :(得分:0)

使用ij代替ljlj与SQL的左连接基本相同。 ij与SQL的内部联接基本相同,这似乎是您正在寻找的内容。

答案 2 :(得分:0)

我认为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

在这里,我们可以看到结果取自地图表中的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,因为它不存在于两个表中,但是从两个表中获取每列。

希望这就是你所需要的。