使用 dbplyr 生成 CROSS JOIN 查询

asa*_*ica 5 sql r dplyr 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())
Run Code Online (Sandbox Code Playgroud)

如何使用Rdbplyr在 t1 和 t2 之间执行实际的* 交叉连接?

* 即CROSS JOIN在翻译后的 SQL 查询中使用

请注意,我知道如何执行所有其他类型的连接,这正是关于 CROSS 连接。

我知道以下技巧:

joined <- t1 %>%
  mutate(tmp = 1) %>%
  full_join(mutate(t2, tmp = 1), by = "tmp") %>%
  select(-tmp)
Run Code Online (Sandbox Code Playgroud)

然而

  1. 这很丑陋(即使它可以隐藏在函数中)
  2. 我想利用数据库高度优化的连接功能,所以我想传递一个真正的 SQL CROSS JOIN。Usingshow_query(joined)显示生成的 SQL 查询使用LEFT JOIN.

可悲的是,没有cross_join运算符 indplyr并且sql_join(t1, t2, type = "cross")也不起作用(未为tbls实现,仅适用于数据库连接)。

如何CROSS JOIN使用 dbplyr生成 SQL ?

Gre*_*gor 5

根据dbplyrNEWS 文件,从 1.10 版开始,如果您使用 a full_join(..., by = character()),它将“促进”联接为交叉联接。这似乎还没有在其他任何地方记录,但是在dbplyr Github 存储库中搜索“cross”,在代码和新闻文件中都找到了它。

这种语法似乎不适用于本地数据框,只能通过 SQL。