2017-06-12 26 views
0

私はPythonで2つのテーブルを結合しようとしています。 (Windowsを使用すると、ジュピターのノートブック)PythonでSQL joinステートメントでpyodbcを使用する

表1は、パンダを使用して読み込まれたExcelファイルです。

TABLE_1= pd.read_excel('my_file.xlsx') 

表2は、pyodbcを使用して接続できるOracleデータベースの大きな表です。私はこのようにpyodbcを使ってテーブル全体を正常に読むことができますが、実行には非常に時間がかかります。

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

だから私はそれがより速く実行され、私は必要なレコードに引っ張るように、内側には、pyodbcインポートの一環として参加したいと思っ。表1と表2は同じ一意の識別子/主キーを共有します。

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) 

しかし、これは機能しません。このエラーが発生します:

 
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)') 

私はこれを行うことができます別の方法はありますか?私は数百人に参加する必要があるだけで何百万ものレコードをインポートしなければならないのは非常に非効率的です。ありがとうございました。

+0

あなたは 'TABLE_1'もデータベースに存在しますか? – Ding

+0

いいえ、TABLE_1はExcelにのみ存在し、私はpandas pd.read_excel()メソッドを使用してインポートしました。 – user2895991

答えて

1

このようなものが動作する可能性があります。 まずDO:次に

MyIds = set(table_1['id']) 

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

今すぐ挿入し、あなたのID:

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

そして、私はMySQLのではないOracleと異なるを使用していた最後

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

yoへのコネクタしかし、原則はおそらく同じです。もちろん、python-sql接続などのコードがもう少しあります。それがうまくいけば、それ以外の場合は一時的なテーブルではなく普通のテーブルを作るようにしてください。

関連する問題