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

Create the SQL query "SELECT * FROM myTable LIMIT 10" using dplyr

假设我连接到名为 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 

结果瞬间返回。

您可以尝试 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

如果您正在查询查询的实际数据,而不是仅仅重新创建 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) 来检索它。