Запрос нескольких таблиц в KDB
Я хочу запросить несколько таблиц в KDB. Например Как написать следующий запрос SQL в KDB (я не очень хорош в SQL, поэтому формат запроса может быть неправильным):
select from table1,table2 where table1.sym=table2.sym and table1.price>table2.price
Я знаю несколько способов сделать это, например. присоединяется. Но есть ли в KDB такая же функциональность, как в SQL, которая делает это просто с помощью точечной нотации в таблицах.
Также в SQL мы можем расширить вышеуказанный запрос до количества n таблиц и фильтров. Можем ли мы сделать это в KDB без сложного выражения?
1 ответ
Короткий ответ: нет, я боюсь.
Вы можете запросить только 1 таблицу за один раз. Вы должны сделать соединение первым. Я не очень хорошо знаю SQL, но я уверен, что движок SQL все равно выполняет операцию соединения, чтобы иметь возможность сделать это (?), Так что если есть способ сделать это в q
через функцию это будет делать соединение.
Если вы хотите извлечь векторы столбцов, вы можете просто проиндексировать таблицу следующим образом (избегайте точечных обозначений внутри функций):
table[`sym]
(получил бы столбец sym как вектор, предполагая, что таблица не является ключевой) (NB Будьте осторожны, когда делаете это на развернутой таблице!)
Вы можете использовать это для in
запросы в предложении where, например. Или, если ваши таблицы имеют одинаковую длину, вы можете использовать их для создания новой временной промежуточной таблицы (но это по-прежнему объединение!)
Это так близко, как вы собираетесь получить без использования обычного ,
, lj
, uj
, так далее
Нет.
SQL является декларативным языком. Ваш запрос сообщает базе данных, что вы хотите, а не как это сделать. Оптимизатор SQL анализирует ваш запрос, создает дерево операторов, оценивает стоимость выполнения каждой операции и пытается переупорядочить дерево, чтобы минимизировать общую стоимость.
Q не имеет оптимизатора базы данных, кроме сидящего за клавиатурой. Вы должны определить порядок операций, и вы должны выполнять их в правильном порядке.
Кроме того, Q работает со столбцами, а не со строками. Так table1.price>table2.price
не имеет смысла, если только table1 и table2 имеют одинаковую длину. Обычно люди обрабатывают это, переименовывая второй столбец, выполняя соединение, а затем фильтруя полученную единственную таблицу.