【问题标题】:Generate CROSS JOIN queries with dbplyr使用 dbplyr 生成 CROSS JOIN 查询
【发布时间】:2019-07-16 16:40:00
【问题描述】:

给定 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())

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

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

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

我知道以下技巧:

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

然而

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

遗憾的是,dplyr 中没有 cross_join 运算符,sql_join(t1, t2, type = "cross") 也不起作用(不适用于 tbls,仅适用于数据库连接)。

如何使用 dbplyr 生成 SQL CROSS JOIN

【问题讨论】:

    标签: sql r dplyr dbplyr


    【解决方案1】:

    根据dbplyr NEWS file,从1.10版本开始,如果你使用full_join(..., by = character()),它会将join“提升”为cross join。这似乎还没有记录在其他任何地方,但是搜索 dbplyr Github repo for "cross" 在代码和 NEWS 文件中都找到了它。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 2021-12-23
      • 1970-01-01
      • 2015-11-03
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      相关资源
      最近更新 更多