首页 > 解决方案 > 从一列中选择与另一列共享值的值

问题描述

这是问题所在。该数据库描述了对象(来自不同物种的基因)之间的对称和可转移关系。如果物种 1 的基因 X 与物种 2 的基因 Y 相关,而物种 2 的基因 Y 与物种 3 的基因 Z 相关,那么物种 1 的基因 X 与物种 3 的基因 Z 相关。

这是一个示例表:

species1 gene1 species2 gene2
2        Y     1        X
2        Y     3        Z

现在,这就是我想要做的。给定物种 1 和 3(都在 species2 列中),找出列gene2 中所有在gene1 列中有共同值的基因。

基本上,这是我想要的输出:

X  Z

...对于满足此条件的每一对。

请注意,每个基因 id 仅存在于一个物种中。

说明:species1 列包含少数“中心”物种(如人类)。所以如果我想找到一个匹配老鼠基因 Card9 的老鼠基因,有两种可能:(i)人类基因组中没有匹配,这种情况下基因 1 列中会有老鼠匹配,或者老鼠基因会在gene1中,而在gene2列中的大鼠基因;(ii)在人类(或其他)基因组中存在匹配,在这种情况下,我需要首先在gene1列中找到人类基因组中的匹配,然后在gene2列中找到与大鼠基因组中该基因的匹配。

显然,我想我可以在 SQL 之外做到这一点:

  1. 从物种 1 中选择列基因 2 中的所有基因
  2. 从物种 3 中选择列基因 2 中的所有基因
  3. 对于物种 1 中的每个基因,在gene1 列中找到匹配的基因,其中species2 为3。

但是,我确信有一个聪明的 SQL 语句可以做到这一点。

该数据库有大约 500 万行。

标签: sqlsqlite

解决方案


如果我理解正确,这是一个自我加入:

select distinct g1.gene2
from genes g1 join
     genes g3
     on g1.species2 = 1 and
        g3.species2 = 3 and
        g1.gene2 = g3.gene2 and
        g1.gene1 = g3.gene1;

推荐阅读