将另一个变量粘贴到我在 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
但是我想将这些结果粘贴到使用 IN
的 WHERE
子句中
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 <- 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;")
【参考方案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 语法错误 [重复]
如何使用 PHP、SQL 和 Microsoft Access 将另一个表中的 select max 函数和用户输入的变量插入表中?