如何在 kdb 中进行完全右外连接?

How to do full right outer join in kdb?

我有这两个table。

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

我想让所有内容都保持正确 table 但复制了 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 中还有其他值,我不想将其放入结果 table:就像我不希望 `rrr 在那里一样。

这应该能满足您的需求:

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

这个怎么样?

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

这里我们将 union 应用于 a) tab1 中不存在于 tab2 中的所有内容和 b) tab1 和 [ 中存在的所有内容=25=] tab2.

不确定我们是否可以将此称为完全外右连接,因为我们不想包含 tab2 中的所有 条记录(rrr 在这种情况下)但这是一个术语问题。