在子查询中使用rownum

时间:2013-04-07 15:16:25

标签: oracle subquery rownum

在算法中,用户传递查询,例如:

SELECT o_orderdate, o_orderpriority FROM h_orders WHERE rownum <= 5

查询返回以下内容:

1996-01-02  5-LOW
1996-12-01  1-URGENT
1993-10-14  5-LOW
1995-10-11  5-LOW
1994-07-30  5-LOW

算法需要选择属性的计数(上例中为o_orderdate, o_orderpriority),因此它将查询重写为:

SELECT o_orderdate, count(o_orderdate) FROM 
  (SELECT o_orderdate, o_orderpriority FROM h_orders WHERE rownum <= 5) 
GROUP BY o_orderdate

此查询返回以下内容:

1992-01-01  5

然而,预期的结果是:

1996-12-01  1
1995-10-11  1
1994-07-30  1
1996-01-02  1
1993-10-14  1

知道如何重写解析阶段或用户如何通过语法上不同的查询来接收上述结果?

3 个答案:

答案 0 :(得分:2)

内部查询返回的行本质上是非确定性的,因为它们取决于优化器将行标识为所需数据集的一部分的顺序。由于修改后的谓词而导致执行计划的更改可能会更改行返回的顺序,添加到表中的新行也可以更改包含哪些行。

答案 1 :(得分:0)

如果您总是想要n行,那么在内部查询中使用distinct(o_orderdate),这将使GROUP BY无效。

或者您可以使用select添加另一个外rownum来获取分组行的n,如下所示:

select o_orderdate, counter from
(
    SELECT o_orderdate, count(o_orderdate) as counter FROM 
      (SELECT o_orderdate, o_orderpriority FROM h_orders) 

    GROUP BY o_orderdate
)
WHERE rownum <= 5

虽然结果很可能毫无用处,因为它们是不确定的(如David Aldridge所说)。

答案 2 :(得分:0)

由于你的外部查询没有使用“o_orderpriority”,为什么不只是删除子查询并简单地查询如下:

SELECT o_orderdate, count(o_orderdate) AS order_count
FROM h_orders
WHERE rownum <= 5
GROUP BY o_orderdate