繁体   English   中英

从一列中选择共享另一列中的值的值

[英]Select values from one column which share a value in another column

这是问题所在。 该数据库描述了对象(来自不同物种的基因)之间的对称和可转移关系。 如果物种 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(都在物种 2 列中),在基因 2 列中找到所有基因,这些基因在基因 1 列中有一个共同的值。

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

X  Z

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

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

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

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

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

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

该数据库有大约 5 百万行。

如果我理解正确,这是一个自连接:

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;

您可以使用自连接来实现:

select t1.gene2 result1, t2.gene2 result2 
from tablename t1 inner join tablename t2
on t2.gene1 = t1.gene1
where t1.species2 = 1 and t2.species2 = 3

请参阅演示
另一种使用聚合的方法:

select min(gene2) result1, max(gene2) result2
from tablename
where species2 in (1, 3)
group by gene1
having result1 <> result2;

请参阅演示
结果:

| result1 | result2 |
| ------- | ------- |
| X       | Z       |

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM