根据列中的值与列表中的值匹配来选择SQL数据库中的行 [英] Selecting rows in SQL database based on value in column matching value in list

查看:25
本文介绍了根据列中的值与列表中的值匹配来选择SQL数据库中的行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个大约有140万行的表,并且我要编写一条SQL SELECT语句,该语句返回列表中出现第一列中的值(唯一ID)的所有行。

此列表可以包含1到50k个ID,并在每次运行脚本时生成,每次可能会有所不同。根据此列表中的id数字值,我只想从数据库中提取第一列中具有这些id数字的行。

更完整地说:我在一个python脚本中完成上述所有操作。此脚本首先生成我需要的ID列表。然后,我将使用pyodbc与Azure ODBC数据库通信。

我的第一个想法是使用"IN"语句:

myquery = SELECT * FROM mydb WHERE id IN mylist

显然,这不起作用,因为您需要在"IN"语句后指定特定值,因为它基本上是"OR"语句的替换。

不幸的是,即使在搜索了几个小时之后,我也找不到一种明显且易于理解的方法来将"IN"语句与mylist的变量名结合使用。在这种情况下,这有可能吗?或者有没有其他更好的方法来达到同样的结果?

编辑:最好是我正在寻找一种方法,而不必在每次运行脚本时为我的ID列表生成新的数据库表。

推荐答案

我按照建议为ID创建了额外的表,从而解决了这个问题。 首先,我使用ID号创建一个附加表,然后使用该表从整个数据库中获取所需的结果,最后再次删除ID表。

我花了一些时间才找到正确的语法,但以下内容使我能够快速了解整个过程:

# Transform my list of ID's to a list of lists
id_list = [[id] for id in ids] 
ID_TABLE = 'id_db_name'

conn = pyodbc.connect(driver='{ODBC Driver 17 for SQL Server}',
                      server='MY_SERVER',
                      database='MY_DATABASE',
                      uid='USERNAME', pwd='PASSWORD')

cursor = conn.cursor()

# Create a new table to store the ID's
create_table = "CREATE TABLE id_db_name (Casenr varchar(12));"
cursor.execute(create_table)
cursor.commit()

# Fill the new ID table with my data
insert_to_tmp_tbl_stmt = f"INSERT INTO {ID_TABLE} VALUES (?)"
cursor.fast_executemany = True
cursor.executemany(insert_to_tmp_tbl_stmt, id_list)

# Get the rows from my full database based on the created ID table
compare = f"SELECT * FROM full_db_name WHERE Casenr in (SELECT * FROM id_db_name)"
cursor.execute(compare)
results = cursor.fetchall()

# Delete the ID table
delete_table = "DROP TABLE dbo.tempTable"
cursor.execute(delete_table)
cursor.commit()

# Close the connection
cursor.close()
conn.close()

虽然上面的代码可能可以稍微清理一下(我自己还在努力学习语法,但我对SQL还很陌生),但是即使对于大型的ID表,它也是功能强大、速度快的。

这篇关于根据列中的值与列表中的值匹配来选择SQL数据库中的行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆