簡體   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