在我工作的研究组中,我们必须每天解决以下问题--数百次,甚至数千次:给出一组假定的基因名称(通常是几百个),标记那些不在我们(MySQL)数据库中的基因名称。我们的各种应用程序和脚本以多种方式解决了这个问题。我想优化这个过程。
当然,最简单的方法是迭代基因名称列表(当然,在删除任何重复的基因名称之后),对于每个基因名称,执行如下的操作
SELECT count(*) FROM gene WHERE genename = 'GENENAME-XYZ';或
SELECT * FROM gene WHERE genename = 'GENENAME-XYZ';并检测搜索失败的情况。
这意味着对数百个,通常是数千个基因执行这样的查询。
(顺便说一句,大多数查询通常是通过使用Python、R、Perl、MATLAB等语言的DBI工具编写的脚本来执行的。)
或者,您可以捏造表单的(通常是巨大的) SQL语句。
SELECT DISTINCT genename FROM gene \
WHERE genename IN ('GENENAME-001', 'GENENAME-002', ..., 'GENENAME-789');...and从结果推导出无效基因名的子集。
也许只有我一个人,但我从如此庞大的SQL语句中获得了一些强大的代码气味。
总之,我没有一个完全令人满意的解决方案,但由于问题必须非常常见,我认为必须有标准的解决方案。如果这是正确的,请让我知道他们是什么。
顺便说一句,假设对DB的访问是只读的.特别是,请排除任何涉及创建临时表的解决方案。
此外,如果有关系,我们的数据库是MySQL数据库。
发布于 2015-12-02 22:19:27
在表x中输入名称。
所有“新名字”的清单:
SELECT x.name
FROM x
LEFT JOIN gene ON x.name = gene.name
WHERE gene.name IS NULL;gene应该在name上有一个索引。
我不认为只用一个IN就能做到这一点。
https://dba.stackexchange.com/questions/121776
复制相似问题