2

我正在尝试编写一个查询来返回存储在数据库中的最新版本的市场索引的 id。

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 查询时,它也有效——但是,当我尝试在外部(父?)查询中使用子查询返回的结果,它返回 0 行 - 我在这里做错了什么?

顺便说一句,我还尝试了一个IN CLAUSE而不是严格的相等匹配,即

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

这也导致了 0 行,尽管和以前一样,当使用硬编码版本号运行父查询时,我得到 1 行返回(如预期的那样)。

顺便说一句,我正在使用 postgeresql,但我更喜欢与 db 无关的解决方案。

4

1 回答 1

3

问题可能是“dow30”不存在 max(version_num)。

尝试以下相关子查询:

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'
                        ) 

我在子查询中添加了 where 子句。

于 2012-05-14T21:33:46.330 回答