【问题标题】:Select values from one column which share a value in another column从一列中选择与另一列共享值的值
【发布时间】:2020-03-21 02:33:02
【问题描述】:

这就是问题所在。该数据库描述了对象(来自不同物种的基因)之间的对称和可转移关系。如果物种 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 列中会有老鼠匹配,或者老鼠基因会在gene1中,而在gene2列中的大鼠基因; (ii)在人类(或其他)基因组中存在匹配,在这种情况下,我需要首先在gene1列中找到人类基因组中的匹配,然后在gene2列中找到与大鼠基因组中该基因的匹配。

显然,我想我可以在 SQL 之外执行此操作:

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

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

数据库有大约 500 万行。

【问题讨论】:

  • 你完全正确! g1.gene2 = g3.gene2 总是 FALSE,因为我们加入了不同的物种,并且来自不同物种的基因总是有不同的 ID。

标签: sql sqlite


【解决方案1】:

您可以通过自加入来做到这一点:

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

请参阅demo。
另一种使用聚合的方法:

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

请参阅demo。
结果:

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

【讨论】:

    【解决方案2】:

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

    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;
    

    【讨论】:

    • 我认为g1.gene2 = g3.gene2永远是假的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2022-09-29
    • 1970-01-01
    • 2021-07-10
    • 2020-03-12
    • 2020-01-26
    相关资源
    最近更新 更多