1

在算法中,用户通过查询,例如:

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

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

4

3 回答 3

2

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

于 2013-04-07T15:28:30.680 回答
0

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

或者您可以添加另一个外部selectrownum获取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 所提到的)。

于 2013-04-07T15:52:41.343 回答
0

由于您的外部查询没有使用“o_orderpriority”,为什么不干脆摆脱子查询并像这样简单地查询:

SELECT o_orderdate, count(o_orderdate) AS order_count
FROM h_orders
WHERE rownum <= 5
GROUP BY o_orderdate
于 2015-07-19T00:09:51.103 回答