#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 изменить первый объект, присоединив второй, он сделает все возможное, чтобы это сработало, если тип первого объекта может быть сохранен после объединения, в противном случае это приведет к ошибке.