dplyr sql加入

时间:2016-10-05 02:14:17

标签: sql r dplyr

考虑以下SQL:

    SELECT D.product_name
      FROM business.payment P
 LEFT JOIN dim.product_name D 
        ON D.product_id = P.product_id

查询返回支付表中的product_names列表,并根据连接执行此操作。

如何将这样的东西复制到dplyr而不会进入内存?我正在使用数据库连接。

我尝试了以下内容,但无济于事:

product_name <- 
  business %>% 
  tbl('dim_product') 

business %>% 
  tbl('payment') %>% 
  left_join(product_name, by = 'product_id') %>% 
  select(product_name) %>% 
  collect()

我搜索得相当大,似乎没有人解决这个问题。

谢谢!

2 个答案:

答案 0 :(得分:3)

这已经过了一段时间,但也许你还在寻找或好奇dplyr基于动词的选项。我正在为我的工作处理同样的问题,并遇到了你的(某种)未回答的问题。当我使用DBIodbc包对MSSQL数据库运行时,下面的内容适用于我。

我在加入之前从表中选择了感兴趣的列,因为这通常是查询数据库时的最佳做法。 dplyr连接函数默认会执行自然连接,因此您可能不必明确提供by参数。

db_con <- DBI::dbConnect(
  drv = odbc::odbc(),
  dsn = <data source name>
)

db_con %>%
  tbl("table1") %>%
  select(col1, col2, col3) %>%
  left_join(
    db_con %>% tbl("table2") %>% select(col3,  col4, col5)
  )

答案 1 :(得分:2)

您可以在dplyr中使用任意SQL:

tbl(my_data, sql("SELECT * FROM flights"))

请注意,这与通过R通过任何其他方式查询数据库没有什么不同,例如RODBC

当然,一旦通过查询将提取的数据导入到R中,提取的数据总是在内存中。它根本不在内存中的一种方式是使用RPostgresRODBC等来发送SQL查询,并使用它在数据库中创建一个新表并且从不导出数据到R。