Кальцит эластичный поиск адаптера эффективное соединение
Как правильно реализовать перезапись JOIN, чтобы запрос получал результаты подзапроса? Например:
SELECT state FROM zips_view WHERE j IN (select j from people_view)
Этот запрос переписывается в SemiJoin, который выполняет внутренний запрос сканирования таблицы (выберите снова _people_view_, как и ожидалось), а затем снова сканирование таблицы для внешнего запроса (выберите против _zips_view_). Второе сканирование может быть заменено фильтрованным запросом, например
SELECT state FROM zips_iew WHERE j IN (1,2,3,4)
Как правильно реализовать "двухфазный" JOIN, который берет результаты подзапроса и добавляет их к внешнему запросу в качестве фильтра / условия?
0 ответов
Я использую здесь соединитель JDBC, и для вашего желаемого запроса:
SELECT state FROM zips_iew WHERE j IN (1,2,3,4)
он генерирует эту реляционную алгебру:
LogicalProject(state=[$0])
LogicalFilter(condition=[OR(=($0, 1), =($0, 2), =($0, 3), =($0, 4))])
JdbcTableScan(table=[[zips_iew, state]])
Вам следует начать с написания правил, которые преобразуют вашу исходную реляционную алгебру (с помощью SemiJoin), а затем продвигаться вниз, чтобы получить реляционную алгебру, как показано выше.