2015-05-21 46 views
0

只有当表中不存在该行的列时,才能将行插入表中的最佳方式是什么。kdb +条件插入:仅在列值不存在时插入

例如为:

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 

这或许可以更容易地完成。我的问题:什么是最简单/最好的方法?

要清楚:列可能是非键控的列。

或者换句话说:表要么键控或非键控和目标列不是键(或部分的化合物键列)

回答

1

首先就是在目标列上有适当的属性(排序,组),这将使功能更快。

现在有2种情况,我能想到的:

一)表是方向性的,目标列是键列:在这种情况下,正常的插会像你的条件插入的方式工作。

b)中表或者是键合或非键控和目标列不是键(或部分的化合物键列):

  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]} 
+0

情景b的确如此。我更新了我的问题。没有比创建函数更简单/更简单的方法吗? –

+0

你在问KDB是否提供了任何内置函数来做到这一点,我不这么认为。即使存在,它也会在后端做同样的事情,或者暂时将该列作为主键并插入。 – Rahul

+0

也许你是对的。我会保持打开一段时间,看看是否有其他答案出现。 –

2

使用一个密钥表?

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 
+0

这确实是键控列的最佳答案,但我也希望为非键控表找到一个干净的解决方案。 –