Создание запросов CROSS JOIN с помощью dbplyr

Учитывая 2 удаленных таблицы (смоделированы с tbl_lazy для этого примера)

library("dplyr")
library("dbplyr")

t1 <- tbl_lazy(df = iris, src = dbplyr::simulate_mysql())
t2 <- tbl_lazy(df = mtcars, src = dbplyr::simulate_mysql())

Как я могу выполнить фактическое * перекрестное соединение между t1 и t2 с помощью R и dbplyr?

* т.е. использование CROSS JOIN в переведенном SQL-запросе

Обратите внимание, что я знаю, как выполнять все другие типы соединений, это как раз о CROSS-соединениях.

Мне известен следующий трюк:

joined <- t1 %>%
  mutate(tmp = 1) %>%
  full_join(mutate(t2, tmp = 1), by = "tmp") %>%
  select(-tmp)

тем не мение

  1. Это уродливо (даже если его можно спрятать в функции)
  2. Я хотел бы воспользоваться преимуществами высокооптимизированных возможностей соединения в базе данных, поэтому я хотел бы передать настоящий SQL CROSS JOIN. Использование show_query(joined) показывает, что сгенерированный запрос SQL использует LEFT JOIN.

К сожалению, в dplyr нет оператора cross_join, и sql_join(t1, t2, type = "cross") тоже не работает (не реализовано для tbls, работает только для соединений с БД).

Как я могу сгенерировать CROSS JOIN SQL с помощью dbplyr?


person asachet    schedule 16.07.2019    source источник


Ответы (1)


Согласно dbplyr NEWS, начиная с версии 1.10, a full_join(..., by = character()), он "продвинет" соединение в перекрестное соединение. Кажется, это еще нигде не задокументировано, но поиск по dbplyr Репозиторий Github для" cross " включил его как в коде, так и в файле NEWS.

Этот синтаксис, похоже, не работает для локальных фреймов данных, только через SQL.

person Gregor Thomas    schedule 16.07.2019