python sqlite3选择具有重复项的多行

python sqlite3选择具有重复项的多行,python,database,performance,select,executemany,Python,Database,Performance,Select,Executemany,我希望从一个大型数据库中执行随机样本,并且希望这些样本配对,这意味着我要么关心(一系列)select语句的结果顺序,要么随后重新排序。此外,还可能存在重复的行。这很好,但我希望有一种有效的方法直接从数据库中生成这些样本。我知道SELECT语句不能与cursor.executemany一起使用,但这确实是我想要的 还有一个类似的问题 OP似乎要求多选,但它对当前的顶级答案表示满意,该答案建议在where子句中使用IN。这不是我真正想要的。我更喜欢像ken.ganong的解决方案,但我想知道它的效率

我希望从一个大型数据库中执行随机样本,并且希望这些样本配对,这意味着我要么关心(一系列)select语句的结果顺序,要么随后重新排序。此外,还可能存在重复的行。这很好,但我希望有一种有效的方法直接从数据库中生成这些样本。我知道SELECT语句不能与cursor.executemany一起使用,但这确实是我想要的

还有一个类似的问题 OP似乎要求多选,但它对当前的顶级答案表示满意,该答案建议在where子句中使用IN。这不是我真正想要的。我更喜欢像ken.ganong的解决方案,但我想知道它的效率

更准确地说,我做了如下工作:

import sqlite3
import numpy as np
# create the database and inject some values
values = [
    (1, "Hannibal Smith", "Command"),
    (2, "The Faceman", "Charm"),
    (3, "Murdock", "Pilot"),
    (4, "B.A. Baracas", "Muscle")]
con = sqlite3.connect('/tmp/test.db')
cur = con.cursor()
cur.execute(
    'CREATE TABLE a_team (tid INTEGER PRIMARY KEY, name TEXT, role TEXT)')
con.commit()
cur.executemany('INSERT INTO a_team VALUES(?, ?, ?)', values)
con.commit()
# now let's say that I have these pairs of values I want to select role's for
tid_pairs = np.array([(1,2), (1,3), (2,1), (4,3), (3,4), (4,3)])
# what I currently do is run multiple selects, insert into a running
# list and then numpy.array and reshape the result
out_roles = []
select_query = "SELECT role FROM a_team WHERE tid = ?"
for tid in tid_pairs.flatten():
    cur.execute(select_query, (tid,))
    out_roles.append(cur.fetchall()[0][0])
#
role_pairs = np.array(out_roles).reshape(tid_pairs.shape)
对我来说,似乎必须有一种更有效的方法将SELECT语句传递给db,db请求多行,每行都有自己的构造函数,但正如我所说,ExecuteMay不能与SELECT语句一起使用。另一种方法是在WHERE子句中使用IN约束,然后在python中进行重复

还有一些额外的限制,例如,我可能在数据库中没有不存在的行,我可能希望通过删除输出对或用默认值替换来处理这些问题,但这些都是次要问题


提前感谢。

DISTINCT
groupby
子句不能帮助您在
中使用
?我不知道您打算如何使用
DISTINCT
groupby
tid
已经是一个
主键
,因此不会在单个
SELECT
中使用
WHERE tid in…
子句复制这些内容,无论如何,我希望保留复制和输入顺序。