【发布时间】:2020-04-03 20:00:23
【问题描述】:
我有以下 2 个示例表。我想把下面的q-sql语句变成功能更新...
A:([]orderID:`Aa`Bb`Cc`Bb`Bb`Cc`Aa; date:2016.10.26 2004.09.30 2004.03.10 2016.11.08 2004.02.14 2010.06.01 2008.05.01; number:9 4 5 4 2 7 8; name:`Emp1`Emp2`Emp3`Emp2`Emp2`Emp3`Emp1; cost:100.7 99.8 84.2 85.5 73.9 91.6 94.1; ID:0 1 1 0 1 1 1)
B:([]oid:`Aa`Dd`Cc`Ee`Bb`Cc`Aa; dte:2009.10.26 2020.04.04 2020.03.06 2006.09.28 2004.02.14 2019.09.27 2012.04.30; num:9 5 7 8 2 6 1; nme:`Emp1`Emp2`Emp1`Emp2`Emp2`Emp4`Emp1; cst:100.7 69.8 74.2 85.5 73.9 81.6 94.1; ID:5 5 7 5 7 5 5)
update ID:5 from A where {[a;b;c;d;e]a,b,c,d,e}'[orderID;date;number;name;cost] in (exec {[a;b;c;d;e]a,b,c,d,e}'[oid;dte;num;nme;cst] from B where ID=5)
如果我对其进行解析,我会收到以下信息...
!
`A
,,(in;((';{[a;b;c;d;e]a,b,c,d,e});`orderID;`date;`number;`name;`cost);(?;`B;,,(=;`ID;5);();,((';{[a;b;c;d;e]a,b,c,d,e});`oid;`dte;`num;`nme;`cst)))
0b
(,`ID)!,5
如何翻译此处的k constraint 语句以在功能更新中工作?
我尝试了以下方法,但检查时没有更新任何结果...
![`A;enlist(in;((';{[a;b;c;d;e]a,b,c,d,e});`orderID;`date;`number;`name;`cost);(?[`B;enlist(=;`ID;5);();enlist enlist((';{[a;b;c;d;e]a,b,c,d,e});`oid;`dte;`num;`nme;`cst)]));0b;(enlist`ID)!enlist 5i]
如果orderID, date, number, name, cost 匹配来自table B 的oid, dte, num, nme, cst 的值,我的目标是更新table A 的ID 列。如果没有,则保持原样。
首选输出如下所示...
q)A
orderID date number name cost ID
---------------------------------------
Aa 2016.10.26 9 Emp1 100.7 5
Bb 2004.09.30 4 Emp2 99.8 1
Cc 2004.03.10 5 Emp3 84.2 1
Bb 2016.11.08 4 Emp2 85.5 0
Bb 2004.02.14 2 Emp2 73.9 1
Cc 2010.06.01 7 Emp3 91.6 1
Aa 2008.05.01 8 Emp1 94.1 1
谢谢。
【问题讨论】:
-
如果我们更了解您正在比较和更新的表格,我们可以更轻松地提供帮助。请提供代码 sn-p 来生成 A 和 B。了解您为什么希望这是函数语句也会很有帮助 - 您是否正在寻找一个可以采用 A 和 B 列名的函数?
-
@JorgeSawyer - 更新了上面的表格和 cmets。让我知道这是否有帮助。除了功能更新,我对其他解决方案持开放态度。虽然实际上我的表有数百万行,但我需要对解决方案进行功能化,以便用于更新我的 ID 列的值并不总是恒定的,例如从 B 的每一行获取 ID,如果必要的列值彼此相等,则将 A 的 ID 值更新为 B 的 ID 值。在这种情况下,我将执行
exec distinct ID from B来获取每个值,然后将该列表传递给函数以在每个值上运行。
标签: kdb