去年のJapan.Rで、
Join処理のSQLは、結構雑
(dplyr様って もはや言語ではないのか? - Redshiftの場合 - // Speaker Deck)
という文を見て、たしかにあれ何とかならないのかなーと思ってたんですが、どうやら0.6.0ではけっこうよくなってそうな雰囲気です。
library(dplyr) con <- DBI::dbConnect(RSQLite::SQLite(), ":memory:") DBI::dbWriteTable(con, "mtcars", mtcars) mtcars2 <- tbl(con, "mtcars") mtcars2 mtcars2 %>% select(cyl) %>% head(3) %>% show_query() #> <SQL> #> SELECT `cyl` AS `cyl` #> FROM `mtcars` #> LIMIT 3 inner_join(mtcars2, mtcars2, by = "cyl") %>% show_query() #> <SQL> #> SELECT `TBL_LEFT`.`mpg` AS `mpg.x`, `TBL_LEFT`.`cyl` AS `cyl`, `TBL_LEFT`.`disp` AS `disp.x`, ... #> FROM `mtcars` AS `TBL_LEFT` #> INNER JOIN `mtcars` AS `TBL_RIGHT` #> ON (`TBL_LEFT`.`cyl` = `TBL_RIGHT`.`cyl`)
このissueでした。
ついでなので書いておくと、SQL生成の部分にもけっこう手が入ってそうなので、今動いているクエリが変わることで副作用があるかもしれません。dplyr越しにデータベースを使ってる人はちょっと試しておいた方がいいかも。