R:直接在服务器上创建表

R: Directly Creating Tables on a Server

提问人:stats_noob 提问时间:12/16/2021 更新时间:12/28/2021 访问量:60

问:

我正在使用 R 编程语言。假设我运行以下代码:

library(RODBC)
library(sqldf)

con = odbcConnect("some name", uid = "some id", pwd = "abc")

sample_query = sqlQuery(con, "select distinct * from table_a a 
inner join table_b b
on (a.date_1 between b.date_2 and b.date_3 and a.id1 = b.id1) or a.id2 = b.id2)

view(sample_query)

我的问题:有没有办法直接将“sample_query”放在“con”语句中指定的服务器上?目前,“sample_query”是在 R studio 的全局环境中创建的 - 但是有没有办法将“sample_query”放在服务器上(即“table_a”和“table_b”所在的位置)?

谢谢!

SQL R 数据库 ODBC 数据操作

评论

1赞 eshirvana 12/16/2021
是的,您可以创建一个存储过程并从 R 执行存储过程
0赞 stats_noob 12/16/2021
@Eshirvana:谢谢你的回复!你能告诉我如何做到这一点吗?谢谢
0赞 r2evans 12/17/2021
存储的进程通常是特定于 DBMS 的,这意味着您不能将存储的进程用于(例如)SQL Server,并期望相同的语法在 PostgreSQL 上工作。但是,a 应该同样有效(只要它们与 SQL 兼容)。.VIEWCREATE VIEW myviewname AS SELECT ... FROM ...
1赞 r2evans 12/20/2021
@stats555,对提供的答案有什么想法吗?您最近有一系列未被接受的答案,请考虑对未被接受答案的问题提供结束或可操作的反馈。
0赞 stats_noob 12/20/2021
@R2Evans:感谢您的回复!我实际上能够弄清楚如何使用“odbc”和“dbi”库做我想做的事情。你想让我发布我想出的答案吗?谢谢!

答:

1赞 eshirvana 12/16/2021 #1

您可以在 RDBMS 中编写一个包含查询的存储过程,如下所示(伪代码,因为它在不同的数据库引擎中的语法可能略有不同):

create procedure procname 
as 
    select distinct * 
    from table_a a 
    inner join table_b b on (a.date_1 between b.date_2 and b.date_3 and a.id1 = b.id1) 
                         or a.id2 = b.id2)
end

然后:

library(RODBC)
library(sqldf)

con = odbcConnect("some name", uid = "some id", pwd = "abc")

sample_query = sqlQuery(con, "exec procname")

view(sample_query)

在某些 rdbms 中,调用过程的命令类似于 。call procname

这样可以避免 SQL 注入问题。

1赞 r2evans 12/17/2021 #2

SQL “VIEW” 往往在 DMBS 之间相当兼容:

CREATE VIEW viewname
AS
select distinct *
from table_a a 
  inner join table_b b
  on (a.date_1 between b.date_2 and b.date_3 and a.id1 = b.id1) or a.id2 = b.id2)

(通常,明确返回的列被认为是一种很好的做法,即不使用 ,尽管这可以看作是对许多列的偏好。*

有了这个,就好像它是一张表,有或没有子句。viewnameWHERE

SELECT * from viewname