2012-05-14 20 views
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,但我更喜歡解決方案是數據庫不可知的。

+0

你有沒有嘗試給子查詢別名? –

+0

'market_index_id'既可以是'ref_market_index'的外鍵,也可以是您要查找的版本記錄的ID?對於匹配記錄,它不會總是'ref_market_index.id'的值嗎?另外,你的子查詢與主表沒有任何關係,那麼它如何找到與「mi.id」記錄相關的最大版本號? – mellamokb

回答

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子句中的子查詢。

+1

我想你沒有想到這一點,他沒有試圖通過'dow30'過濾掉子查詢只是外部查詢 –

+0

我認爲你錯過了這一點。子查詢中的max(version_num)是所有mi.short_name中的最大值。顯然,數據中的總體最大值不同於'dow30'的最大值。他/她需要獲得由外部查詢選擇的索引的最大值。 –

+0

那麼你如何解釋,當他自己運行子查詢時,它會返回預期值? –