dplyr 0.6.0はJOIN系のクエリもけっこういい感じ

去年の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越しにデータベースを使ってる人はちょっと試しておいた方がいいかも。