[英]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 之外做到這一點:
但是,我確信有一個聰明的 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.