使用 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)
来检索它。
假设我连接到名为 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
:
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)
来检索它。