使用ROW_NUM时,Oracle查询行顺序不同

时间:2017-10-10 10:45:36

标签: sql oracle

我在ORACLE中使用Between条件,以实现分页。我将按降序对C​​NT列上的数据进行排序,以便首先显示最多的计数值。

我正在获得具有正常顺序和行号顺序的不同行顺序。

以下是我的数据集:

PATTERN_TBL

PATTERN  |  CNT
1        |  3
Aaaa Aaa |  14
aaaaaa   |  3

普通查询:

SELECT PATTERN, CNT FROM PATTERN_TBL ORDER BY CNT DESC

PATTERN  |  CNT
Aaaa Aaa |  14
aaaaaa   |  3
1        |  3

在查询之间:

SELECT ROW_N, PATTERN,CNT FROM (SELECT 
 ROW_NUMBER() OVER ( ORDER BY CNT DESC) AS ROW_N,
  PATTERN, CNT FROM PATTERN_TBL) 
WHERE ROW_N BETWEEN 1 AND 100 

PATTERN  |  CNT
Aaaa Aaa |  14
1        |  3
aaaaaa   |  3

在上述两个输出中,行#3和行#2正在互换。我想修理订单。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

您的问题是,您有两行cnt的值相同。这带来了更大的稳定排序问题。

关系数据库中的排序不稳定(这个question的答案给出了稳定排序的良好描述)。也就是说,当order by键具有相同的值时,它们可以按任何顺序出现。它们可以在不同的运行中以不同的顺序出现。

这实际上很明显。 SQL表表示无序集。也就是说,没有自然排序,因此无法定义稳定的排序。

如果要在排序中保持一致性,则需要确保键唯一地定义每一行。我通常有一个id列,可以添加为order by的最后一个键。

在您的情况下,您可以使用模式:order by cnt desc, pattern

答案 1 :(得分:0)

ORDER BY CNT DESC, PATTERN 

适用于您的情况。

如果没有,可能会使用pseudocolumn ORA_ROWSCN

ORDER BY CNT DESC, ORA_ROWSCN

如果您检索的记录不是同时批量插入的,那么这将有效。不知道你是否可以在窗口功能中使用它,试试吧