Добавить список списков в таблицу

#kdb #k

#kdb #k

Вопрос:

Давайте посмотрим на определение upsert :

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

Таким образом, это просто изменение всего:

 .[d;();v;y]   <=&&t;   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 не хочет присоединять , список списков к таблице таким же образом, как в «Изменить весь». Мне интересно, почему.

Не могли бы вы дать мне несколько указаний, пожалуйста?

Ответ №1:

Следует провести аналогию между изменением всего и назначением через оператор, а не объединением:

 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
  

В разделе, на который я ссылался, даже упоминается, что ,: «это синтаксический сахар для изменения At».

Ответ №2:

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

Когда вы используете amend, вы указываете q изменить таблицу, чтобы она могла объединять списки в таблицу.

Я думаю об этом как,

  • объединение без изменения — простое объединение двух объектов, это зависит от того, соответствуют они друг другу или нет, от того, как будет выглядеть конечный результат
  • объединить с изменением — вы специально указываете q изменить первый объект, присоединив второй, он сделает все возможное, чтобы это сработало, если тип первого объекта может быть сохранен после объединения, в противном случае это приведет к ошибке.