【问题标题】:Using pyodbc with SQL join statement in Python在 Python 中使用带有 SQL 连接语句的 pyodbc
【发布时间】:2017-06-12 21:53:56
【问题描述】:

我正在尝试在 Python 中加入 2 个表。 (使用 Windows,jupyter 笔记本。)

表1是使用pandas读取的excel文件。

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

表 2 是 oracle 数据库中的一个大表,我可以使用 pyodbc 连接到它。我可以像这样使用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: sql 'SELECT * FROM ORACLE.TABLE_1 执行失败 ORACLE.TABLE1.ID=TABLE_2.ID 上的内部连接 ​​TABLE_2:('42S02','[42S02] [Oracle][ODBC][Ora]ORA-00942: 表或视图不存在\n (942) (SQLExecDirectW)')

还有其他方法可以做到这一点吗?当我只需要加入几百条记录时,必须导入包含数百万条记录的整个表似乎非常低效。谢谢。

【问题讨论】:

  • TABLE_1是否也存在于数据库中?
  • 不,TABLE_1 只存在于 excel 中,我使用 pandas pd.read_excel() 方法导入了它。

标签: python pandas join pyodbc


【解决方案1】:

这样的事情可能会奏效。 先做:

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)

最后

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

我使用的是 MySQL 而不是 oracle 和不同的连接器,但原理可能是相同的。当然还有更多的代码与 python-sql 连接等。希望它能工作,否则尝试制作一个常规表而不是临时表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多