将另一个变量粘贴到我在 R 中的 SQL 查询中

Posted

技术标签:

【中文标题】将另一个变量粘贴到我在 R 中的 SQL 查询中【英文标题】:Pasting another variables results into my SQL query in R 【发布时间】:2018-06-27 19:06:28 【问题描述】:

所以我在 R 中使用这三个包来连接到一些数据库并查询它们:

library(rJava)
library(RJDBC)
library (RPostgreSQL)

id_query <- dbGetQuery(conn2, "SELECT b.id id FROM table1 a LEFT JOIN table2 b ON a.id = b.id WHERE a.id = 1684 AND b.id <> 40378;")

这会产生这样的输出:

id
25559
30352
15352
17587
16480
16296
40449
34962
25827
37282

但是我想将这些结果粘贴到使用 INWHERE 子句中

results_query <- dbGetQuery(con, "SELECT
i.event_date,
                              i.id,
                              i.id2,
                              i.id3,
                              i.id4,
                              i.id5,
                              COUNT(i.sales) sales,
                              COUNT(c.volume) volume
                              FROM table1 i
                              LEFT JOIN
                              table2 c
                              ON i.id = c.id
                              AND i.id2 = c.id2
                              AND i.id3 = c.id3
                              WHERE i.event_date = DATE('2018-06-18')
                              AND i.id IN (**RESULTS FROM id_query**)
                              GROUP BY 1,2,3,4,5,6
                              LIMIT 10
                              ;")

所以我希望该行如下所示:

AND i.id IN (25559, 30352, 15352, 17587, 16480, 16296, 40449, 34962, 25827, 37282)

我试过这样做:

results_query <- dbGetQuery(con, "SELECT
    i.event_date,
                                  i.id,
                                  i.id2,
                                  i.id3,
                                  i.id4,
                                  i.id5,
                                  COUNT(i.sales) sales,
                                  COUNT(c.volume) volume
                                  FROM table1 i
                                  LEFT JOIN
                                  table2 c
                                  ON i.id = c.id
                                  AND i.id2 = c.id2
                                  AND i.id3 = c.id3
                                  WHERE i.event_date = DATE('2018-06-18')
                                  AND i.id IN (", paste(id_query$id, collapse = ", "), ")
                                  GROUP BY 1,2,3,4,5,6
                                  LIMIT 10
                                  ;")

我从this answer 得到的语法是什么,但它会产生这个错误:

Error in .verify.JDBC.result(s, "Unable to execute JDBC prepared statement ",  : 
  Unable to execute JDBC prepared statement SELECT
        i.event_date,
                                      i.id,
                                      i.id2,
                                      i.id3,
                                      i.id4,
                                      i.id5,
                                      COUNT(i.sales) sales,
                                      COUNT(c.volume) volume
                                      FROM table1 i
                                      LEFT JOIN
                                      table2 c
                                      ON i.id = c.id
                                      AND i.id2 = c.id2
                                      AND i.id3 = c.id3
                                      WHERE i.event_date = DATE('2018-06-18')
                                      AND i.id IN  ( (Method Connection.prepareStatement is not yet implemented)

任何人都有:

A.) 修复我当前查询的解决方案或

B.) 另一种选择?

【问题讨论】:

您可以将实际查询放在括号内,而不是 (**RESULTS FROM id_query**) @wildplasser 这不起作用,因为查询来自两个完全不同的数据库。仅供参考,我实际上并没有完全像那样放置(**RESULTS FROM id_query**)。我相信你知道但只是想澄清一下。 好奇,您用于 RJDBC 的另一个数据库是什么(即 con 对象)? @parfait 一个是 Redshift 数据库(第一个),第二个查询使用 AWS Athena 数据库。他们都需要单独的登录和一切。除非我错了,您可以将它们组合起来并执行以下操作:i.id IN (id_query &lt;- dbGetQuery(conn2, "SELECT b.id id FROM table1 a LEFT JOIN table2 b ON a.id = b.id WHERE a.id = 1684 AND b.id &lt;&gt; 40378;") 【参考方案1】:

尝试在原始查询中添加 paste(..., sep = ''):

results_query <- dbGetQuery(con,  paste("SELECT 
                                      i.event_date,
                                      i.id,
                                      i.id2,
                                      i.id3,
                                      i.id4,
                                      i.id5,
                                      COUNT(i.sales) sales,
                                      COUNT(c.volume) volume
                                      FROM table1 i
                                      LEFT JOIN
                                      table2 c
                                      ON i.id = c.id
                                      AND i.id2 = c.id2
                                      AND i.id3 = c.id3
                                      WHERE i.event_date = DATE('2018-06-18')
                                      AND i.id IN (", paste(id_query$id, collapse = ", "), ")
                                      GROUP BY 1,2,3,4,5,6
                                      LIMIT 10
                                      ;", sep = ''))

【讨论】:

这仍然给我同样的错误:AND i.id IN ( (Method Connection.prepareStatement is not yet implemented) 您确定按照此答案的建议将 SQL 包装在更大的 paste 调用中吗?这与您的代码尝试不同。

以上是关于将另一个变量粘贴到我在 R 中的 SQL 查询中的主要内容,如果未能解决你的问题,请参考以下文章

查询中的 SQL 变量导致意外的 SQL 语法错误 [重复]

将R数据帧带入带有粘贴功能的sql可用列表

使用粘贴功能将 R 数据框带入 sql 可用列表

如何使用 PHP、SQL 和 Microsoft Access 将另一个表中的 select max 函数和用户输入的变量插入表中?

在 SQL 语句/查询中使用 jQuery 变量

通过 R 在 SQL 查询中粘贴值