Вот проблема. База данных описывает симметричные и переносимые отношения между объектами (генами разных видов). Если ген X вида 1 относится к гену Y вида 2, а ген Y вида 2 относится к гену Z вида 3, то ген X вида 1 относится к гену Z вида 3.
Вот пример таблицы:
species1 gene1 species2 gene2
2 Y 1 X
2 Y 3 Z
Теперь вот что я хочу сделать. Для заданных видов 1 и 3 (оба в столбце видов2) найдите все гены в столбце ген2, для которых в столбце ген 1 есть общее значение.
По сути, это вывод, который я хотел бы получить:
X Z
... для каждой пары, которая удовлетворяет этому условию.
Обратите внимание, что каждый идентификатор гена уникально присутствует только в одном виде.
Объяснение: столбец видов1 содержит несколько виды "hub" (как люди). Поэтому, если я хочу найти ген крысы, совпадающий с геном мыши Card9, есть две возможности: (i) в геноме человека нет совпадения, и в этом случае будет совпадение крысы в столбце gene1, или ген мыши будет быть в gene1 и ген крысы в столбце gene2; (ii) существует совпадение в геноме человека (или в каком-либо другом), и в этом случае мне сначала нужно найти совпадение в геноме человека в столбце gene1, а затем найти совпадение с этим геном в геноме крысы в столбце gene2.
Очевидно, я представляю, что смогу сделать это за пределами SQL:
- Выбрать все гены в столбце gene2 из вида 1
- Выбрать все гены в столбце gene2 вида 3
- Для каждого гена вида 1 найдите соответствующие столбцы в столбце gene1, для которого столбец вида 2 равен 3.
Однако я уверен, что есть умный оператор SQL, который может это сделать.
В базе данных около 5 миллионов строк.