使用 dbplyr 生成 CROSS JOIN 查询
Generate CROSS JOIN queries with 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())
如何使用 R 和 dbplyr[=45 在 t1 和 t2 之间执行 actual* 交叉连接=]?
* 即在已翻译的 SQL 查询中使用 CROSS JOIN
请注意,我知道如何执行所有其他类型的连接,这正是关于 CROSS 连接的。
我知道以下技巧:
joined <- t1 %>%
mutate(tmp = 1) %>%
full_join(mutate(t2, tmp = 1), by = "tmp") %>%
select(-tmp)
但是
- 这很丑(即使它可以隐藏在函数中)
- 我想利用数据库高度优化的连接功能,所以我想传递一个真实的 SQL
CROSS JOIN
。使用 show_query(joined)
表明生成的 SQL 查询使用 LEFT JOIN
.
遗憾的是,dplyr
中没有 cross_join
运算符,sql_join(t1, t2, type = "cross")
也不起作用(未实现 tbl
s,仅适用于数据库连接)。
如何使用 dbplyr 生成 SQL CROSS JOIN
?
根据 dbplyr
NEWS file, since version 1.10, if you use a full_join(..., by = character())
, it will "promote" the join to a cross join. This doesn't seem to be documented anywhere else yet, but searching the dbplyr Github repo for "cross" 在代码和新闻文件中都出现了它。
此语法似乎不适用于本地数据帧,只能通过 SQL。
给定 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())
如何使用 R 和 dbplyr[=45 在 t1 和 t2 之间执行 actual* 交叉连接=]?
* 即在已翻译的 SQL 查询中使用 CROSS JOIN
请注意,我知道如何执行所有其他类型的连接,这正是关于 CROSS 连接的。
我知道以下技巧:
joined <- t1 %>%
mutate(tmp = 1) %>%
full_join(mutate(t2, tmp = 1), by = "tmp") %>%
select(-tmp)
但是
- 这很丑(即使它可以隐藏在函数中)
- 我想利用数据库高度优化的连接功能,所以我想传递一个真实的 SQL
CROSS JOIN
。使用show_query(joined)
表明生成的 SQL 查询使用LEFT JOIN
.
遗憾的是,dplyr
中没有 cross_join
运算符,sql_join(t1, t2, type = "cross")
也不起作用(未实现 tbl
s,仅适用于数据库连接)。
如何使用 dbplyr 生成 SQL CROSS JOIN
?
根据 dbplyr
NEWS file, since version 1.10, if you use a full_join(..., by = character())
, it will "promote" the join to a cross join. This doesn't seem to be documented anywhere else yet, but searching the dbplyr Github repo for "cross" 在代码和新闻文件中都出现了它。
此语法似乎不适用于本地数据帧,只能通过 SQL。