2016-05-11 2 views
2

У меня эти две таблицы.Как сделать полное правое внешнее соединение в kdb?

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

Я хочу, чтобы держать все в правой таблице, но дублируется col1, чтобы соответствовать col1 в tab2. Ближайший я нашел 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 

Если есть другие значения в col1 в tab2, я не заинтересован, чтобы положить, что привести таблицу : вроде я не хочу `rrr там.

ответ

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 

Здесь мы применяем объединение в) все от tab1, который не присутствует в tab2 и б) все, что присутствует в обоих tab1иtab2.

Не уверен, что мы можем назвать это полное внешнее право присоединиться потому что мы не хотим, чтобы включить все записи из tab2 (rrr в данном случае), но это проблема терминологии.

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 

Не сильно испытания, но это отправная точка!

EDIT: на самом деле, это немного более тонко, чем это. Флип вызовет проблемы, когда в 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 
Смежные вопросы