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

我想选择 TOP 500 行,并且因为 Oracle 在 GROUP 和 ORDER BY 条件(证据)之前处理 where 子句,我必须通过将此查询包装在另一个中来选择前 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

NHibernate 知道如何创建选择前 x 行的正确查询。

  • HQL 和普通 SQL 查询:query.SetMaxResults(500).
  • QueryOver 和 Linq 查询:query.Take(500).
于 2013-04-18T05:45:04.183 回答
0

阻止我使用前面答案中建议的 Take() 方法的问题是由于我的陈述的 ORDER BY 部分。在 Take() 之后评估 ORDER BY,这意味着返回了错误的 500 个结果。

我通过创建一个表示包含 ORDER BY 子句的查询的视图来解决该问题,然后在从视图中选择时,Take() 方法按预期工作。

于 2013-04-19T07:44:30.920 回答