这个嵌套查询有什么问题?

时间:2012-05-14 21:21:00

标签: sql postgresql

我正在尝试编写一个查询来返回存储在数据库中的市场索引的最新版本的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行返回(正如预期的那样)。

BTW我正在使用postgeresql,但我更喜欢这个解决方案是db不可知的。

1 个答案:

答案 0 :(得分: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子句。