这是我查询使用此网站找到的代码:
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
只是一个简单的单值列表,但我不知道如何使用复合键或两列。
答案 0 :(得分:1)
由于您正在运行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)))