sql - 从一列中选择与另一列共享值的值
问题描述
这是问题所在。该数据库描述了对象(来自不同物种的基因)之间的对称和可转移关系。如果物种 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(都在 species2 列中),找出列gene2 中所有在gene1 列中有共同值的基因。
基本上,这是我想要的输出:
X Z
...对于满足此条件的每一对。
请注意,每个基因 id 仅存在于一个物种中。
说明:species1 列包含少数“中心”物种(如人类)。所以如果我想找到一个匹配老鼠基因 Card9 的老鼠基因,有两种可能:(i)人类基因组中没有匹配,这种情况下基因 1 列中会有老鼠匹配,或者老鼠基因会在gene1中,而在gene2列中的大鼠基因;(ii)在人类(或其他)基因组中存在匹配,在这种情况下,我需要首先在gene1列中找到人类基因组中的匹配,然后在gene2列中找到与大鼠基因组中该基因的匹配。
显然,我想我可以在 SQL 之外做到这一点:
- 从物种 1 中选择列基因 2 中的所有基因
- 从物种 3 中选择列基因 2 中的所有基因
- 对于物种 1 中的每个基因,在gene1 列中找到匹配的基因,其中species2 为3。
但是,我确信有一个聪明的 SQL 语句可以做到这一点。
该数据库有大约 500 万行。
解决方案
如果我理解正确,这是一个自我加入:
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;
推荐阅读
- android - CardView error: Cannot resolve class android.support.v7.widget.CardView
- python - 如何从不同文件中动态导入VSCode模块?
- ios - 如何在 Swift 中使程序化滚动视图容器高度与其内容的确切大小一致?
- c++ - 适用于所有其他编译器的 MSVC 错误 C2280(试图引用已删除的函数)
- bash - 使用 $BASH_SOURCE 变量时“没有这样的文件或目录”
- reactjs - 未捕获的 ReferenceError:未定义 rootReducer(在 laravel 中进行反应)
- postgresql - 使用自定义位置偏移连接 tsvector
- rust - gmp-mpfr-sys 无法在 macOS catalina 10.15.6 上构建
- python - 如何在 Python 中按两列分组、计算加权平均值、返回 DataFrame
- java - 带有 Spring Boot 的 Atomikos 给出 atomikos.icatch.SysException: No Assembler Service found - 请确保正确的 jar 在您的类路径中