这是我使用浏览此网站找到的代码进行的查询:
query="""SELECT Family
FROM Table2
INNER JOIN Table1 ON Table1.idSequence=Table2.idSequence
WHERE (Table1.Chromosome, Table1.hg19_coordinate) IN ({seq})
""".format(seq=','.join(['?']*len(matchIds_list)))
matchIds_list
是 (?,?) 格式的元组列表。
如果我只要求一个条件(即仅 Table1.Chromosome
而不是 Chromosome
和 hg_coordinate
)和 ,它就有效>matchIds_list
只是一个简单的单个值列表,但我不知道如何让它与复合键或两列一起使用。
最佳答案
由于您运行的是 SQLite 3.7.17,我建议仅使用临时表。
创建并填充临时表。
cursor.executescript("""
CREATE TEMP TABLE control_list (
Chromosome TEXT NOT NULL,
hg19_coordinate TEXT NOT NULL
);
CREATE INDEX control_list_idx ON control_list (Chromosome, hg19_coordinate);
""")
cursor.executemany("""
INSERT INTO control_list (Chromosome, hg19_coordinate)
VALUES (?, ?)
""", matchIds_list)
只需将查询限制到控制列表临时表即可。
SELECT Family
FROM Table2
INNER JOIN Table1
ON Table1.idSequence = Table2.idSequence
-- Constrain to control_list.
WHERE EXISTS (
SELECT *
FROM control_list
WHERE control_list.Chromosome = Table1.Chromosome
AND control_list.hg19_coordinate = Table1.hg19_coordinate
)
最后执行您的查询(无需格式化此查询)。
cursor.execute(query)
# Remove the temporary table since we're done with it.
cursor.execute("""
DROP TABLE control_list;
""")
<小时/>
短查询(需要 SQLite 3.15):您实际上几乎已经完成了。您需要将 IN ({seq})
设为子查询
表达。
SELECT Family
FROM Table2
INNER JOIN Table1
ON Table1.idSequence = Table2.idSequence
WHERE (Table1.Chromosome, Table1.hg19_coordinate) IN (VALUES {seq});
长查询(需要 SQLite 3.8.3):看起来有点复杂,但非常简单。把你的 控件列表到子选择中,然后通过控件约束该主选择 列表。
SELECT Family
FROM Table2
INNER JOIN Table1
ON Table1.idSequence = Table2.idSequence
-- Constrain to control_list.
WHERE EXISTS (
SELECT *
FROM (
SELECT
-- Name the columns (must match order in tuples).
"" AS Chromosome,
":1" AS hg19_coordinate
FROM (
-- Get control list.
VALUES {seq}
) AS control_values
) AS control_list
-- Constrain Table1 to control_list.
WHERE control_list.Chromosome = Table1.Chromosome
AND control_list.hg19_coordinate = Table1.hg19_coordinate
)
无论您使用哪种查询,在格式化 SQL 时,都将每个复合站点的 {seq}
替换为 (?,?)
键而不仅仅是 ?
。
query = " ... ".format(seq=','.join(['(?,?)']*len(matchIds_list)))
最后,当您执行查询时,会展平 matchIds_list
,因为它是一个元组列表。
import itertools
cursor.execute(query, list(itertools.chain.from_iterable(matchIds_list)))
关于python - 尝试通过 SQLite 中的复合主键长列表来选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49536460/