python - 尝试通过 SQLite 中的复合主键长列表来选择行

标签 python sqlite

这是我使用浏览此网站找到的代码进行的查询:

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 而不是 Chromosomehg_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/

相关文章:

ruby - ActiveRecord 不会更新

iphone - 在 iOS 中如何输出我的 sqlite3 数据库表结构?

python - 具有 python 字典值的 Gurobi 目标

jquery - django 管理和自动完成灯 : Select2: An instance of jQuery or a jQuery-compatible library was not found

python - 引号引起的语法错误

python - 如何解决mysql每日分析在日期变化时发生的问题

python - 运行 django 本地服务器而不是在 shell 别名中打开 chrome 页面

java - 从另一个 Activity 中检索 Spinner 自定义位置以在另一个 Spinner 中使用

sqlite - 如何在sqlite中使用glob并查找大括号?

从 SQLite 数据库读取许多表并在 R 中组合