2016-11-21 9 views
0

Ich habe ein Problem mit sqlquery Datenbank verbinden mit R.Wie verbinden Datenbank mit 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) 

Hier input=c("abc","def","wvy","etz"), aber der eigentliche Eingang verfügt über mehr als 10.000 Textelemente.

Der Kanal ist bereits für die Verbindung mit der Datenbank eingerichtet.

Es sieht aus wie es gibt einige Probleme mit Where-Klausel, aber ich weiß nicht, wie es zu beheben ist.

Kann mir jemand dabei helfen?

+0

Welche Fehlermeldung erhalten Sie? Kannst du überhaupt eine Verbindung zu deiner Datenbank herstellen? funktioniert eine einfache Abfrage (z. B. 'SELECT * FROM your_database')? – epo3

+0

Ja, ich laufe im SQL-Client mit SQL-Abfrage und es funktioniert. Ich kann nach dem Testen einer einfachen Abfrage eine Verbindung zur Datenbank herstellen. Fehler: "42000 27 FEHLER:" [RODBC] FEHLER: Konnte nicht SQLExecDirect – kaneroy

+0

Ich ändere meinen Code basierend auf der folgenden Diskussion, aber habe noch ein Problem: sqlQuery (channel, sprintf ("select pb.M, pb.P, pb.B , pb.BR, pb.SA, st.TO von pb INNER JOIN mp auf mp.M = pb.M INNER JOIN fb auf fb.F = mp.in INNER JOIN st auf pb.M = st.M und pb. P = st.P und pb.S = st.S wo fb.s in '% s' ", paste0 (input, collapse =" ',' "))) – kaneroy

Antwort

1

paste0 funktioniert nicht so, wie Sie es verwenden. Sie müssten verwenden:

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) 

Als nächstes, wie Sie diese strukturiert haben im query Argument führen wird ein Vektor ist. Sie sollten anstreben, query eine einzelne Zeichenfolge zu haben.

Sie könnten 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) 

schließlich mit besser dran, ich bin nicht sicher, ob diese Abfrage gültige SQL-Syntax ist. Vielleicht irre ich mich, aber ich glaube nicht, dass Sie mehrere Tabellen in der FROM Klausel wie Sie hier haben können. Wenn Sie mehrere Tabellen benötigen, sollten Sie sich ihnen anschließen.

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

EDIT: Ich habe gerade gesehen, dass Ihr input über 10.000 Elemente hat, die sqlExecute ziemlich langsam machen. Sind Sie sicher, dass eine LIKE die beste Möglichkeit ist, diese Daten abzufragen. Wenn möglich, würde ich einen anderen Ansatz zur Isolierung der Daten empfehlen, die Sie benötigen.

+0

ich habe versucht, sprintf und schreibe mein SQL mit INNer Join um, funktioniert aber immer noch nicht: – kaneroy

+0

Mein Code ist: sqlQuery (channel, sprintf ("select pb.M", "pb.P", "pb.B", "pb.BR", "pb.SA", "st.TO") pb INNER JOIN mp auf mp.M = pb.M INNER JOIN fb auf fb.F = mp.in INNER JOIN st auf pb.M = st.M und pb.P = st.P und pb.S = st.S wo fbs in% s ", Eingabe)) – kaneroy

+0

Der Zweck der Verwendung dieser Multi-Tabelle mit innerem Join besteht darin, die Kapazität von R zu testen, um Daten von zu erhalten m 1TB Netezza-Datenbank, die keine relationale DB ist. Ich möchte sehen, wie viel Zeit benötigt wird, wenn die komplizierteste Abfrage verwendet wird, wenn in Zukunft 10.000 Eingaben oder mehr verarbeitet werden. Vielen Dank; – kaneroy