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を使用していますが、解決策がデータベースに依存しないことを好みます。

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 に答える