创建SQL查询" SELECT * FROM myTable LIMIT 10"使用dplyr

时间:2017-10-27 02:29:26

标签: sql r dplyr tidyverse dbplyr

假设我有一个名为con的外部数据库的连接。

我想使用dplyr来重现此查询

SELECT var1, var2, var3 from myTable LIMIT 10

我试过了

qry <- tbl(con, "myTable") %>%
    select(var1) %>%
    filter(between(row_number(), 1, 10)

但它没有给出所需的结果,它产生的查询比我之后的查询要慢得多。

它产生的查询是

SELECT "var1",
FROM SELECT "var1", row_number() OVER () AS "zzz25"
FROM SELECT "var1" AS "var1"
FROM myTable "yhydrqlhho") "zsdfunxidf"
WHERE zzz25 BETWEEN 1.0 AND 10.0)

当我将此查询发送到数据库时,它会运行很长时间。当我发送

SELECT var1 from myTable limit 10 

结果立刻回来了。

2 个答案:

答案 0 :(得分:8)

您可以尝试head(10),它会在Postgres上生成正确的SQL查询:

tbl(con, 'my_table') %>% select(var1, var2) %>% head(6) %>% explain()
# here con is a PostgreSQL connection

#<SQL>
#SELECT "var1" AS "var1", "var2" AS "var2"
#FROM "my_table"
#LIMIT 6

答案 1 :(得分:0)

如果您要查询的是实际数据,而不仅仅是重新创建SQL查询,那么指定collect(n=10)将提供与@Psidom答案相同的输出。

tbl(con, 'my_table') %>% select(var1, var2) %>% collect(n=10)

# A tibble: 10 x 2
   var1  var2 
   <chr>       <dbl>   
 1 text1            87.8     
 2 text2            99.6    
 3 text3           100       
 4 text4            91.9     
 5 text5            76.8    
 6 text6            77.8    
 7 text7            77.2    
 8 text8            97.2  
 9 text9            97.5
10 text10            80.4

请注意,collect()中的默认值为n = 1e+05,因此,如果您的数据(过滤后)包含更多行,则需要指定collect(n=Inf)进行检索。