Кальцит эластичный поиск адаптера эффективное соединение

Как правильно реализовать перезапись 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), а затем продвигаться вниз, чтобы получить реляционную алгебру, как показано выше.

Другие вопросы по тегам