给定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 在t1和t2之间执行实际的交叉联接?

*,即在翻译后的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

  • 可悲的是,cross_join中没有dplyr运算符,并且sql_join(t1, t2, type = "cross")也无效(不适用于tbl,仅适用于DB连接)。

    如何使用dbplyr生成SQL CROSS JOIN

    最佳答案

    根据 dbplyr NEWS file,从1.10版开始,如果您使用full_join(..., by = character()),它将把连接“提升”为交叉连接。似乎尚未在其他任何地方进行记录,但是搜索dbplyr Github repo for "cross"会将其同时显示在代码和NEWS文件中。

    该语法似乎仅通过SQL不适用于本地数据帧。

    关于sql - 使用dbplyr生成CROSS JOIN查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57061921/

    10-12 13:57