2017-06-12 2 views
0

J'essaie de joindre 2 tables en Python. (À l'aide de Windows, carnet jupyter.)Utilisation de pyodbc avec l'instruction de jointure SQL en Python

Le tableau 1 est un fichier Excel lu en utilisant des pandas.

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

Le tableau 2 est une grande table dans la base de données Oracle à laquelle je peux me connecter en utilisant pyodbc. Je peux lire toute la table avec succès en utilisant pyodbc comme ça, mais cela prend beaucoup de temps.

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

Je voudrais faire une jointure interne dans le cadre de l'importation de pyodbc, de sorte qu'il est plus rapide et je ne tirer dans les dossiers nécessaires. Le Tableau 1 et le Tableau 2 partagent le même identifiant unique/clé primaire.

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) 

Mais cela ne fonctionne pas. Je reçois cette erreur:

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

Y at-il une autre façon que je peux le faire? Il semble très inefficace d'avoir à importer une table entière avec des millions d'enregistrements alors que je n'ai besoin que de quelques centaines. Je vous remercie.

+0

Est-ce que 'TABLE_1' existe aussi dans la base de données? – Ding

+0

Non, TABLE_1 n'existe que dans Excel et je l'ai importé en utilisant la méthode pandas pd.read_excel(). – user2895991

Répondre

1

Une telle chose pourrait fonctionner. AVANT TOUT:

MyIds = set(table_1['id']) 

Puis:

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

Maintenant, insérez votre ids:

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

Et enfin

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

Je l'ai utilisé MySQL pas oracle et un autre connecteur à yo mais les principes sont probablement les mêmes. Bien sûr, il y a un peu plus de code avec les connexions python-sql etc. Espérons que cela fonctionne, sinon essayez de faire une table régulière plutôt que temporaire.