【发布时间】: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 中选择列基因 2 中的所有基因
- 从物种 3 中选择列基因 2 中的所有基因
- 对于来自物种 1 的每个基因,在gene1 列中找到匹配的基因,其中species2 列是3。
但是,我确信有一个聪明的 SQL 语句可以做到这一点。
数据库有大约 500 万行。
【问题讨论】:
-
你完全正确! g1.gene2 = g3.gene2 总是 FALSE,因为我们加入了不同的物种,并且来自不同物种的基因总是有不同的 ID。