У меня есть таблица «t» и подтаблица «st». Если значения подтаблицы совпадают со значениями таблицы, мы хотим обновить таблицу «t» со значением Y в новом столбце с именем «существует», иначе N.
Table:
q)t:([] id:("ab";"cd";"ef";"gh";"ij"); refid:("";"ab";"";"ef";""); typ:`BUY`SELL`BUY`SELL`BUY)
q)t
id refid typ
---------------
"ab" "" BUY
"cd" "ab" SELL
"ef" "" BUY
"gh" "ef" SELL
"ij" "" BUY
subtable:
q)st:([] id:("ab";"cd"); typ:`BUY`SELL)
q)st
id typ
---------
"ab" BUY
"cd" SELL
Desired Output:
id refid typ exists
----------------------
"ab" "" BUY Y
"cd" "ab" SELL Y
"ef" "" BUY N
"gh" "ef" SELL N
"ij" "" BUY N
Пробовал разные вещи, такие как любой, каждый, правильный каждый, в - но мог получить желаемый результат.
Один из вариантов — использовать left join (lj)
q) update `N^exists from t lj `id`typ xkey update exists:`Y from st
id refid typ exists
----------------------
"ab" "" BUY Y
"cd" "ab" SELL Y
"ef" "" BUY N
"gh" "ef" SELL N
"ij" "" BUY N
Здесь я определил столбцы id
и typ
как ключи для таблицы st
. Измените ключи таблицы st
на столбцы, которые вы хотите сопоставить с таблицей t
.
Ответ Рахула намного аккуратнее, чем то, что следует, но следующее может быть более производительным, в зависимости от размеров вашей таблицы. Сопоставляя столбцы в t
и st
(индексируя и переворачивая) и определяя логическое значение совпадающих строк, переданное в логический словарь YN, мы можем получить желаемый результат.
q)`N`Y (flip cols[st]!t[cols[st]]) in st
`Y`Y`N`N`N
q)update exists:(`N`Y (flip cols[st]!t[cols[st]]) in st) from t
id typ refid exists
----------------------
"ab" BUY "" Y
"cd" SELL "ab" Y
"ef" BUY "" N
"gh" SELL "ef" N
"ij" BUY "" N
q)\t:100000 update exists:(`N`Y (flip cols[st]!t[cols[st]]) in st) from t
446
q)\t:100000 update `N^exists from t lj `id`typ xkey update exists:`Y from st
856
Метод Rahuls lj может стать быстрее после применения атрибутов.
Отредактировано в соответствии с наблюдениями Рахула,
Другой альтернативой другим ответам является извлечение столбцов подтаблицы из t
(cols[st]#t
) и проверка их наличия в st
:
update exists:(cols[st]#t)in st from t
id refid typ exists
----------------------
"ab" "" BUY 1
"cd" "ab" SELL 1
"ef" "" BUY 0
"gh" "ef" SELL 0
"ij" "" BUY 0
Если вам нужно отобразить результат как YN, вы можете внести небольшие изменения, чтобы получить следующее:
update exists:`N`Y(cols[st]#t)in st from t
id refid typ exists
----------------------
"ab" "" BUY Y
"cd" "ab" SELL Y
"ef" "" BUY N
"gh" "ef" SELL N
"ij" "" BUY N
Вам нужно изменить
c
на cols[st], иначе это выдаст ошибку, потому что присваивание не разрешено в этом разделе qsql. Кроме того, команду можно было бы сделать короче: `update exists:`N`Y (cols[st]#t) in st from t `