2017-06-12 3 views
0

Ich versuche, 2 Tabellen in Python beizutreten. (Unter Windows, Jupyter-Notebook.)Verwenden von pyodbc mit SQL-Join-Anweisung in Python

Tabelle 1 ist eine Excel-Datei, die mit Pandas eingelesen wurde.

Tabelle 2 ist eine große Tabelle in Oracle-Datenbank, die ich mit Pyodbc verbinden kann. Ich kann die gesamte Tabelle erfolgreich lesen, indem ich pyodbc wie folgt verwende, aber es dauert sehr lange.

sql = "SELECT * FROM ORACLE.table_2" 
cnxn = odbc.connect(##########) 
TABLE_2 = pd.read_sql(sql, cnxn) 

So würde Ich mag eine innere Verknüpfung als Teil des Pyodbc Imports zu tun, so dass es schneller läuft und ich nur in den benötigten Aufzeichnungen ziehen. Tabelle 1 und Tabelle 2 teilen sich denselben eindeutigen Bezeichner/Primärschlüssel.

sql = "SELECT * FROM ORACLE.TABLE_1 INNER JOIN TABLE_2 ON ORACLE.TABLE1.ID=TABLE_2.ID" 
cnxn = odbc.connect(##########) 
TABLE_1_2_JOINED = pd.read_sql(sql, cnxn) 

Aber das funktioniert nicht. Ich erhalte diesen Fehler:

 
DatabaseError: Execution failed on sql 'SELECT * FROM ORACLE.TABLE_1 
INNER JOIN TABLE_2 ON ORACLE.TABLE1.ID=TABLE_2.ID': ('42S02', '[42S02] 
[Oracle][ODBC][Ora]ORA-00942: table or view does not exist\n (942) 
(SQLExecDirectW)') 

Gibt es eine andere Möglichkeit, die ich tun kann? Es scheint sehr ineffizient zu sein, ganze Tabellen mit Millionen von Datensätzen zu importieren, wenn ich nur ein paar hundert verbinden muss. Vielen Dank.

+0

Gibt es auch 'TABLE_1' in der Datenbank? – Ding

+0

Nein, TABLE_1 existiert nur in Excel und ich habe es mit der Methode pandas pd.read_excel() importiert. – user2895991

Antwort

1

So etwas könnte funktionieren. zuerst tun:

MyIds = set(table_1['id']) 

Dann:

SQL1 = "CREATE TEMPORARY TABLE MyIds (ID int);" 

jetzt Ihre ids einfügen:

SQL2 = "INSERT INTO MyIds.ID %d VALUES %s" 
for element in list(MyIds): 
    cursor.execute(SQL2, element) 

Und schließlich

SQL3 = "SELECT * FROM ORACLE.TABLE_1 WHERE ORACLE.TABLE1.ID IN (SELECT ID FROM MyIds)" 

ich verwendet habe MySQL nicht Orakel und eine andere Stecker zu yo Aber die Prinzipien sind wahrscheinlich die gleichen. Natürlich gibt es ein bisschen mehr Code mit den Python-Sql-Verbindungen usw. Hoffe, es funktioniert, sonst versuchen Sie eine reguläre Tabelle zu machen, anstatt eine temporäre.