2012-05-14 2 views
2

Я пытаюсь написать запрос, чтобы вернуть идентификатор последней версии рыночного индекса, хранящегося в базе данных.Что случилось с этим вложенным запросом?

SELECT miv.market_index_id market_index_id from ref_market_index_version miv 
INNER JOIN ref_market_index mi ON miv.market_index_id = mi.id 
WHERE mi.short_name='dow30' 
AND miv.version_num = (SELECT MAX(m1.version_num) FROM ref_market_index_version m1 INNER JOIN ref_market_index m2 ON m1.market_index_id = m2.id) 

Данное заявление SQL может быть (примерно) переведено в форму:

SELECT some columns FROM SOME CRITERIA MATCHED TABLES 
WHERE mi.short_name='some name' 
AND miv.version_num = SOME NUMBER 

То, что я не понимаю, что когда я поставляю фактическое число (вместо подзапроса), оператор SQL работает - также, когда я тестирую SUB-запрос, используемый для определения последнего номера версии, который также работает, однако, когда я пытаюсь использовать результат, возвращаемый sub-запросом во внешнем (родительском?) запросе, он возвращает 0 строки - что я здесь делаю неправильно?

Кстати, я также попробовал IN CLAUSE вместо строгого матча равенства т.е.

... AND miv.version_num IN (SUB QUERY) 

Это также привел к 0 строк, хотя, как и раньше, при запуске родительского запроса с жестко закодированным номером версии, я получаю 1 строка возвращена (как и ожидалось).

BTW Я использую postgeresql, но я предпочитаю, чтобы решение было db агностиком.

+0

У вас пытались дать псевдоним подзапросам? –

+0

Как «market_index_id» может быть как внешним ключом к 'ref_market_index', так и идентификатором версии, которую вы ищете? Не всегда ли значение 'ref_market_index.id' для соответствующей записи? Кроме того, ваш подзапрос не имеет никакого отношения к основной таблице, поэтому как найти максимальный номер версии, относящийся к записи 'mi.id'? – mellamokb

ответ

3

Проблема, вероятно, в том, что max (version_num) не существует для 'dow30'.

Попробуйте следующий связанный подзапрос:

SELECT miv.market_index_id market_index_id 
from ref_market_index_version miv INNER JOIN 
    ref_market_index mi 
    ON miv.market_index_id = mi.id 
WHERE mi.short_name='dow30' AND 
     miv.version_num = (SELECT MAX(m1.version_num) 
         FROM ref_market_index_version m1 INNER JOIN 
           ref_market_index m2 
           ON m1.market_index_id = m2.id 
         where m1.short_name = 'dow30' 
         ) 

Я добавил ИНЕКЕ в подзапросе.

+1

Я думаю, вы не поймали точку здесь, он не пытается отфильтровать подзапрос «dow30» только внешний запрос –

+0

Я думаю, что вам не хватает смысла. Max (version_num) в подзапросе - это максимум по всему mi.short_name. Очевидно, что общий макс в данных отличается от max для «dow30». S/ему нужно получить max для индекса, выбранного внешним запросом. –

+0

Тогда как вы объясните, что когда он запускает подзапрос сам по себе, он возвращает ожидаемое значение? –