如何在kdb中进行完全正确的外连接?

时间:2016-05-11 19:15:31

标签: join outer-join kdb

我有这两张桌子。

tab1:([]col1:`abc`def`ghi;col2:2 4 6);
tab2:([]col1:`def`ghi`ghi`rrr;col3:5 10 11 15);

我希望将所有内容保留在正确的表中,但重复col1以匹配tab2中的col1。我找到的最接近的是ij

tab2 ij 1! tab1

col1 col3 col2  
--------------
def  5    4   
ghi  10   6    
ghi  11   6  

但是,我想产生这样的结果:

col1 col3 col2
--------------
abc       2
def  5    4   
ghi  10   6   
ghi  11   6  

如果tab2中的col1中还有其他值,我不想把它放到结果表中:就像我不想在那里使用`rrr。

2 个答案:

答案 0 :(得分:1)

这可以为您提供您正在寻找的内容:

q){x,flip y}/[tab1 lj `col1 xgroup tab2]
col1 col2 col3
------------------
abc  2    `long$()
def  4    5
ghi  6    10
ghi  6    11

没有经过严格测试,但它是一个起点!

编辑:实际上,它比这更微妙。当col3中出现空白列表时,翻转将导致问题,上面的示例恰好可以避免这种情况。

你可能需要这样的东西来捕获边缘情况:

q){x,$[0=count f:flip y;enlist first each y;f]}/[();tab1 lj `col1 xgroup tab2]
col1 col2 col3
--------------
abc  2
def  4    5
ghi  6    10
ghi  6    11

答案 1 :(得分:0)

这个怎么样?

q)uj[select from tab1 where not col1 in exec col1 from tab2;tab2 ij 1!tab1]
col1 col2 col3
--------------
abc  2        
def  4    5   
ghi  6    10  
ghi  6    11

此处我们将联合应用于a)tab1tab2不存在的所有内容和b tab1 {中存在的所有内容{1}}。

我们不确定是否可以调用此完全外部右连接,因为我们不希望在tab2中包含所有记录(在本例中为tab2)但是这是一个术语问题。