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 tradeId?
答案 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)
请注意,您请求的输出不是有效的键控表,因为它包含重复的键;这是尽可能接近的。