0

让我们看看 的定义upsert

q)upsert
.[;();,;]

所以它只是一个Amend Entire

.[d;();v;y]   <=>   v[d;y]

q).[1 2; (); ,; 3 4 5]
1 2 3 4 5

它看起来像,在引擎盖下加入。但是应用相同的方法向表中添加一些行会产生不同的结果:

q)show t:((`a`b!1 2);(`a`b!3 4))
a b
---
1 2
3 4
q).[t;();,;(5 6;7 8)]
a b
---
1 2
3 4
5 6
7 8
q),[t;(5 6;7 8)]
`a`b!1 2
`a`b!3 4
5 6
7 8

出于某种原因q,不想以,与 Amend Entire 相同的方式将列表列表加入表中。我想知道为什么。

你能给我一些指示吗?

4

2 回答 2

2

当您使用带有表和列表的普通逗号连接时,您将连接两个不同的结构并获得您可能期望的结果,如上一个示例所示。

当您使用 amend 时,您是在告诉 q 修改表,因此它能够将列表连接到表中。

我认为它是,

  • 不加修改地加入 - 简单地加入两个对象,这取决于它们是否符合最终结果的外观
  • join with amend - 你明确告诉 q 通过加入第二个对象来修改第一个对象,如果第一个对象的类型在加入后可以保留,它将尽其所能允许它工作,否则会出错。
于 2020-08-11T20:53:03.670 回答
2

应该在通过 operator而不是 join修改整体和分配之间进行类比:

q)show t:((`a`b!1 2);(`a`b!3 4))
a b
---
1 2
3 4
q),:[t;(5 6;7 8)]
q)t
a b
---
1 2
3 4
5 6
7 8

如您所见,后者与

q)t:((`a`b!1 2);(`a`b!3 4))
q)show t:t,(5 6;7 8)
`a`b!1 2
`a`b!3 4
5 6
7 8

我链接的部分甚至提到,:“是 Amend At 的语法糖”。

于 2020-08-11T21:40:22.443 回答