Создание таблицы KDB+ / Q с внешним ключом

Мой вопрос касается создания таблицы с помощью q и использования внешних ключей. Я знаю, как это сделать следующим образом

q)T1:([id:1 2 3 4 5]d1:"acbde")
q)T2:([id:1 2 3 4 5]f1:`T1$2 2 2 4 4)

Но теперь скажем, я хочу создать таблицу с оператором !, переворачивающим словарь таким образом.

q)T3:1!flip ((`id`f1 )!((1 2 3 4 5);(2 2 2 4 4)))

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

Обновить

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

Что делать, если у меня есть эти списки макетов списков A и B

q)A:enlist 1 2 3 4 5
q)B:(enlist "abcde"), (enlist `v`w`x`y`z)
q)flip (`id`v1`v2)!(B,A)

Как я могу сделать список A внешним ключом для таблицы T1?

Обновление 2

И как мне это реализовать, если у меня откуда-то берется A, а не инициализирую сам. Нужно ли делать копию из списка?


person Martin Mlostek    schedule 05.06.2015    source источник


Ответы (1)


Вы можете использовать тот же синтаксис в списке значений столбца:

q)T3:1!flip ((`id`f1 )!((1 2 3 4 5);(`T1$2 2 2 4 4)))
q)T3~T2
1b

Обновление:

Опять же, для этого случая мы можем использовать тот же синтаксис в списке —

q)A:enlist`T1$1 2 3 4 5
q)meta flip (`id`v1`v2)!(B,A)
c | t f  a
--| ------
id| c
v1| s
v2| j T1

Обновление 2:

Тот же синтаксис применяется к имени переменной:

q)A:1 2 3 4 5
q)meta flip (`id`v1`v2)!(B,enlist`T1$A)
c | t f  a
--| ------
id| c
v1| s
v2| j T1
person jgleeson    schedule 05.06.2015
comment
Спасибо. Это работает, но я не смог решить свою настоящую проблему. я обновил свой вопрос - person Martin Mlostek; 05.06.2015
comment
ну @jgleeson ... update2 -> с A дать вот так q)A:enlist`T1$1 2 3 4 5 это единственный способ сделать q)flip (`id`v1`v2)!(B,enlist`T1$A[0]) ? - person Martin Mlostek; 21.06.2015
comment
Если A является этим форматом, вы можете использовать синтаксис в Update1 — flip (`id`v1`v2)!(B,A). - person jgleeson; 22.06.2015