kdb+ условная вставка: вставка только в том случае, если значение столбца не существует

Как лучше всего вставить строку в таблицу, только если столбец этой строки не существует в таблице.

E.g.:

q)table:([] col1:(); col2:(); col3:());
q)`table insert (1;2;3);
q)conditionalInsert:{if[first where table.col1=x(0)~0N;`table insert x]};

Теперь при выполнении следующих действий:

q)conditionalInsert[(1;2;3)];
q)conditionalInsert[(7;8;9)];

В результате получается:

q)table
col1 col2 col3
--------------
1    2    3
7    8    9

Вероятно, это можно сделать проще. Мой вопрос: какой самый простой/лучший способ?

Для ясности: столбец может быть неключевым.

Или, другими словами: Таблица либо с ключом, либо без ключа, а целевой столбец не является ключом (или частью столбцов составного ключа)


person Jean-Paul    schedule 21.05.2015    source источник


Ответы (2)


Во-первых, нужно иметь правильные атрибуты (сортировка, группировка) в целевом столбце, что ускорит работу.

Теперь есть 2 сценария, о которых я могу думать:

a) Таблица имеет ключ, а целевой столбец является столбцом с ключом: В этом случае обычная вставка будет работать так же, как ваша условная вставка.

б) Таблица либо с ключом, либо без ключа, а целевой столбец не является ключом (или частью столбцов составного ключа):

         q)conditionalInsert: {if[not x[0] in table.col1;`table insert x]} 

Лучше использовать «exec» вместо «table.col1», так как запись через точку не работает для таблицы с ключом:

         q)conditionalInsert: {if[not x[0] in exec col1 from table;`table insert x]}  
person Rahul    schedule 21.05.2015
comment
Сценарий б действительно. Я обновил свой вопрос. Нет ли более короткого/более простого способа сделать это, чем создать функцию? - person Jean-Paul; 21.05.2015
comment
Вы спрашиваете, предоставляет ли KDB какую-либо встроенную функцию для этого, я так не думаю. Даже если есть , он будет делать то же самое на задней панели или может временно сделать столбец первичным ключом и выполнить вставку. - person Rahul; 21.05.2015
comment
Может быть ты прав. Я оставлю его открытым немного дольше, чтобы посмотреть, появятся ли какие-либо другие ответы. - person Jean-Paul; 21.05.2015

Использовать таблицу с ключами?

q)table  
col1| col2 col3  
----| ---------  
1   | 2    3  
q)`table insert (1;2;4)  
'insert  
q)`table insert (2;2;4)  
,1  
q)table  
col1| col2 col3  
----| ---------  
1   | 2    3  
2   | 2    4  

вы всегда можете использовать защищенную оценку, чтобы скрыть ошибку.

q).[insert;(`table;(1;2;4));{`already_there}]  
`already_there  
q).[insert;(`table;(3;2;4));{`already_there}]  
,2  
q)table  
col1| col2 col3  
----| ---------  
1   | 2    3  
2   | 2    4  
3   | 2    4  
person Akash    schedule 21.05.2015
comment
Это действительно лучший ответ для столбца с ключом, но я также хотел бы найти чистое решение для столбца без ключа. - person Jean-Paul; 21.05.2015