У меня есть одна таблица "трассировка", которая содержит следующую информацию:

|  galaxyId  |  lastProgenitorId  |
-----------------------------------
|  0         |  27                |
|  2890      |  3001              |
|  ...       |  ...               |
|  189279    |  190056            |
-----------------------------------

И у меня есть еще одна таблица main, которая включает в себя следующее:

|  galaxyId  |  stellarMass  |  umag  |  imag  |
------------------------------------------------
|  25        |  10.5         |  -21   |  -22   |
|  2901      |  10.8         |  -23   |  -21   |
|  3000      |  10.0         |  -22   |  -21   |
|  ...       |  ...          |  ...   |  ...   |
|  200000    |  10.1         |  -22   |  -22   |
------------------------------------------------

Что я хочу сделать, так это получить для каждого trace.galaxyId ВСЕ соответствующие строки в maintable, где выполняется следующее условие:

main.galaxyId BETWEEN trace.galaxyId AND trace.lastProgenitorId

Это может вернуть несколько результатов, например (из приведенного выше примера):

|  trace.galaxyId  |  main.galaxyId  |  main.umag  |  main.imag  |
------------------------------------------------------------------
|  0               |  25             |  -21        |  -22        |
|  2890            |  2901           |  -23        |  -21        |
|  2890            |  3000           |  -22        |  -21        |
------------------------------------------------------------------ 

Я чувствую, что это легко, но мой мозг просто не может понять, как это сделать! Мне кажется, нужен PARTITION BY? Любая помощь очень ценится. Заранее спасибо.

sql
0
Carl M 27 Авг 2014 в 13:25
Какую СУБД вы используете? Постгрес? Оракул?
 – 
a_horse_with_no_name
27 Авг 2014 в 13:30
Я использую внешний сервис, документация по которому отсутствует. Так что ответ - я вообще-то не знаю.
 – 
Carl M
27 Авг 2014 в 13:34

1 ответ

Лучший ответ

Используйте соединение:

SELECT 
    t.GalaxyId As TraceGalaxyId,
    m.GalaxyId as MainGalaxyId,
    m.umag,
    m.imag 
FROM trace
JOIN main m 
ON m.galaxyId BETWEEN t.GalaxyId AND t.lastProgenitorId AND m.snap = 'Specific Value'
1
Paul Grimshaw 27 Авг 2014 в 13:54
Если бы у main был другой столбец, m.snap, и я хотел бы искать только объекты с определенным значением this в качестве дополнительного условия, как бы изменился этот запрос?
 – 
Carl M
27 Авг 2014 в 13:40
Просто добавьте AND m.snap = конкретное значение
 – 
SEB BINFIELD
27 Авг 2014 в 13:44
Добавлено как предложено @SEBBINFIELD
 – 
Paul Grimshaw
27 Авг 2014 в 13:54
Спасибо вам обоим. В качестве дальнейшего упражнения, есть ли способ ограничить количество строк, возвращаемых для каждого t.galaxyId, например, до 3?
 – 
Carl M
27 Авг 2014 в 13:56
Более сложный. Посмотрите предложение ROW_NUMBER () и подзапросы. Сначала попробуйте, а затем предложите задать новый вопрос, если вы застряли
 – 
Paul Grimshaw
27 Авг 2014 в 13:57