真正的联合加入kdb

时间:2016-06-23 20:22:44

标签: union kdb

kdb中的uj会将所有内容加起来,如果之前显示的话并不重要。我想知道如何才能真正加入联盟。请参阅下面的代码:

密钥为id,currency1,currency2

tab1:([]Id:1 1;currency1:`USD`USD;currency2:`GBP`EUR;nop:10 10);


  Id currency1 currency2 nop
  -------------------------------------------
   1  USD       GBP       10 
   1  USD       EUR       10

tab2:([]Id:1 1;trade:2222 5555;currency1:`USD`USD;currency2:`GBP`JPY)


 Id trade currency1 currency2
 -----------------------------------------------
 1  2222    USD       GBP      
 1  5555    USD       JPY    

我想让它看起来像

        Id currency1 currency2 nop     trade
       ----------------------------------------
        1   USD       GBP       10     2222
        1   USD       EUR       10
         1  USD       JPY               5555

我正在考虑使用uj和第一个参数来使用左连接,第二个参数选择tab2中的一个而不是选项卡1和连接。但我需要做的是将id,currency1和currency2加在一起形成另一列。我认为它效率不高。

更新

在这种情况下我该怎么做

tab1:([]Id:1 1 1 1;currency1:`USD`USD`USD`USD;currency2:`GBP`GBP`GBP`EUR;tradeId:10 20 30 40);

tab2:([]Id:1 1;trade:2222 5555;currency1:`USD`USD;currency2:`GBP`JPY)

如果ID 1货币1和货币2重复,我该怎么办? 我希望它看起来像:

Id currency1 currency2| tradeId trade
----------------------| -------------
1  USD       GBP      | 10      2222 
1  USD       GBP      | 20      2222
1  USD       GBP      | 30      2222
1  USD       EUR      | 40           
1  USD       JPY      |         5555 

我的回答是:

uj[tab1 lj 3!tab2;select from (tab2 lj 3!tab1) where null tradeId]

我想知道是否有更快的方式,并想知道是否可以说null tr​​adeId?

2 个答案:

答案 0 :(得分:2)

q)t1:([]Id:1 1;currency1:`USD`USD;currency2:`GBP`EUR;nop:10 10);
q)t2:([]Id:1 1; currency1:`USD`USD;currency2:`GBP`JPY; trade:2222 5555);

q)t1
Id currency1 currency2 nop
--------------------------
1  USD       GBP       10
1  USD       EUR       10

q)t2
Id currency1 currency2 trade
----------------------------
1  USD       GBP       2222
1  USD       JPY       5555

q)0!(3!t1) uj 3!t2
Id currency1 currency2 nop trade
--------------------------------
1  USD       GBP       10  2222
1  USD       EUR       10
1  USD       JPY           5555

uj与键控表的行为不同: http://www.timestored.com/kdb-guides/qsql-inner-left-joins#union-join “使用来自kt2的匹配更新kt1中的现有记录,附加任何不匹配。”

答案 1 :(得分:0)

以下是您更新后问题的答案。

q){(y lj x xkey z)uj 0!(x#y)_x xkey z}[`Id`currency1`currency2;tab1;tab2]
Id currency1 currency2 tradeId trade
------------------------------------
1  USD       GBP       10      2222
1  USD       GBP       20      2222
1  USD       GBP       30      2222
1  USD       EUR       40
1  USD       JPY               5555
q)

请注意,您请求的输出不是有效的键控表,因为它包含重复的键;这是尽可能接近的。