0

私の質問は、ここ StackOverflow で見た他の質問とは微妙に異なるため、これを以前の回答と混同しないでください。

質問があります

SELECT tab1.Id 
  FROM TABLE1 tab1 
  WHERE tab1.modified_date between to_date('01/04/2013 10:00:00', 'dd/mm/yyyy HH:MI:SS') and to_date('01/04/2013 11:15:00', 'dd/mm/yyyy HH:MI:SS') 
  GROUP BY tab1.Id
  ORDER BY max(tab1.received_date) desc

上位 500行を選択したいのですが、Oracle は GROUP および ORDER BY 条件の前に where 句を処理するため ( evidence )、このクエリを別のクエリでラップして上位 500 を選択する必要があります。

だから、今私のクエリは次のようになります...

SELECT * 
FROM (SELECT tab1.Id 
  FROM TABLE1 tab1 
  WHERE tab1.modified_date between to_date('01/04/2013 10:00:00', 'dd/mm/yyyy HH:MI:SS') and to_date('01/04/2013 11:15:00', 'dd/mm/yyyy HH:MI:SS') 
  GROUP BY tab1.Id
  ORDER BY max(tab1.received_date) desc ) sub 
WHERE ROWNUM <=500      

これはすべてうまく機能しますが、これを QueryOver API を使用して NHibernate クエリに変換するのに苦労しています。内部クエリは単純です。

var subquery = QueryOver.Of<Table1>()
            .Select(Projections.Group<Table1>(e => e.Id))
            .....where clause
            .OrderBy(Projections.Max<Table1>(e => e.Received_Date)).Desc

しかし、これをselect * from subquery where rownum <= 500でラップするにはどうすればよいですか?

4

2 に答える 2

0

以前の回答で提案された Take() メソッドを使用できなかった問題は、ステートメントの ORDER BY 部分が原因でした。Take() の後に ORDER BY が評価されていたため、間違った 500 件の結果が返されていました。

ORDER BY 句を含むクエリを表すビューを作成して問題を回避したところ、ビューからの選択時に Take() メソッドが期待どおりに機能しました。

于 2013-04-19T07:44:30.920 に答える