2016-11-21 31 views
0

我使用的SQLQuery问题连接到数据库R.如何数据库有R

library(RODBC) 
res =sqlQuery(channel, 
    paste0("select pb.col1,pb.col2 from pb, 
        mp,fb,st 
      where fb.col10 in ('%s',input), 
      and fb.col20=mp.col30 
      and pb.col40=st.col50 
      and pb.col45=st.col60 
      and mp.col40=pb.col80 and 
      pb.col80=st.col90"), 
     believeNRows=F) 

这里,input=c("abc","def","wvy","etz")连接,但真正投入有超过10,000个字符串元素。

通道已经设置为连接数据库。

它看起来像where子句有一些问题,但我不知道如何解决它。

任何人都可以帮助我吗?

+0

你会得到什么错误信息?你能连接到你的数据库吗?做一个简单的查询工作(例如'SELECT * FROM your_database')? – epo3

+0

是的,我运行SQL客户端与SQL查询,它的工作原理。测试一个简单的查询后,我可以连接到数据库。错误:“42000 27错误:”[RODBC]错误:不能SQLExecDirect – kaneroy

+0

我基于以下讨论修改我的代码,但仍有问题:sqlQuery(channel,sprintf(“select pb.M,pb.P,pb.B ,pb.BR,pb.SA,st.TO from pb INNER JOIN mp on mp.M = pb.M INNER JOIN fb on fb.F = mp.in INNER JOIN st on pb.M = st.M and pb。 P = st.P和pb.S = st.S其中fb.s in'%s'“,paste0(input,collapse =”','“))) – kaneroy

回答

1

paste0不按照您使用它的方式工作。您可能需要使用:

sprintf("select pb.col1,pb.col2 
     from pb,mp,fb,st 
      where fb.col10 in %s 
      and fb.col20=mp.col30 
      and pb.col40=st.col50 
      and pb.col45=st.col60 
      and mp.col40=pb.col80 and 
      pb.col80=st.col90", input) 

接下来,你有这样的结构将导致query参数是一个向量。您应该旨在让query成为单个字符串。

你可能会使用RODBCext

library(RODBCext) 
res =sqlExecute(channel, 
       "select pb.col1,pb.col2 
       from pb,mp,fb,st 
       where fb.col10 in ?, 
        and fb.col20=mp.col30 
        and pb.col40=st.col50 
        and pb.col45=st.col60 
        and mp.col40=pb.col80 
        and pb.col80=st.col90", 
       data = list(c("abc", "def", "wvy", "etz")), 
       fetch = TRUE, 
       stringsAsFactors = FALSE) 

最后会更好,我不知道这种查询是有效的SQL语法。也许我错了,但我不认为你可以在这里列出FROM子句中的多个表。如果你需要多个表格,应该有一些加入他们的方法。

FROM Table1 LEFT JOIN Table2 ON Table1.ID = Table2.Ref 

编辑:我刚才看到你input拥有超过10,000个元素,这将使sqlExecute相当缓慢。您确定LIKE是查询这些数据的最佳方式吗?如果可能的话,我会推荐一些其他的方法来隔离你需要的数据。

+0

我已经采用的sprintf试图并用INNer Join重写我的SQL,但仍然无效: – kaneroy

+0

我的代码是:sqlQuery(channel,sprintf(“select pb.M,pb.P,pb.B,pb.BR,pb.SA,st.TO from pb INNER JOIN mp on mp.M = pb.M INNER JOIN fb on fb.F = mp.in INNER JOIN st on pb.M = st.M and pb.P = st.P and pb.S = st.S其中fb.s in%s“,input)) – kaneroy

+0

将这些多表与内连接结合使用的目的是测试R的获取数据的能力m 1TB Netezza数据库,它不是关系数据库。我希望看到在将来处理10000个或更多输入时使用最复杂的查询需要多少时间。谢谢; – kaneroy