0

我通过他们的 id 订购了我的结果:

    CREATE TABLE my_table2 AS SELECT * FROM my_table ORDER BY record_group_id;

现在当我执行时:

    SELECT DISTINCT record_group_id  FROM my_table2 where rownum <=1000000; 

我得到了随机顺序的 gorup id,尽管我的顺序很好:这是结果集中的一些记录

1599890050
1647717203
1647717120
1647717172
1647716972
1647717196
1647717197
1647717205
1599889999
1599889986

可能的原因是什么?DISTINCT 语句不应该以与表中相同的顺序返回记录吗?

4

5 回答 5

4

既不SELECT或也不DISTINCT定义数据的顺序。

如果您想明确定义Order您需要的有序数据。

SELECT DISTINCT record_group_id 
FROM my_table2 
WHERE rownum <=1000000 
ORDER BY record_group_id; 
于 2013-10-18T13:37:49.283 回答
3

排序仅确定插入表中的源数据的顺序。如果表中没有聚集索引,这意味着记录将按物理顺序存储。

但是,记录的存储方式并不能保证它们会按该顺序被选中。执行计划程序确定运行查询的最有效方式,这意味着数据可能不会以您认为的方式获取,并且它可能会随着数据的变化不时发生变化,或者只是关于数据的统计信息.

对于示例中的简单查询,您通常会得到可预测的结果,但无法保证,因此您始终需要对获取数据的查询进行排序,以确保获得可预测的结果。

在这种情况下,您没有按照它们存储在表中的顺序获取数据的一个原因可能是使用了索引来过滤结果,并且记录是按照索引的顺序而不是按照索引的顺序返回的。表的顺序。

于 2013-10-18T13:43:20.007 回答
1

在您的 SELECT 语句中使用 ORDER BY:

SELECT DISTINCT record_group_id
FROM my_table2
WHERE rownum <=1000000
ORDER BY record_group_id;
于 2013-10-18T13:39:10.190 回答
1

使用DISTINCT对顺序没有影响,只会影响值的唯一性。

如果您也想控制订单:

SELECT DISTINCT record_group_id
FROM my_table2
WHERE rownum <= 1000000
ORDER BY record_group_id -- Added this line
于 2013-10-18T13:39:57.890 回答
0

您认为表中的数据是有序的假设是错误的。数据库表中没有隐式排序——它只是一袋未排序的数据。

如果您需要有序数据,则必须使用 ORDER BY - 没有办法绕过它(DISTINCT 和 GROUP BY 也没有......),请参阅关于 Order By 的 TomKyte 博客

于 2013-10-18T13:53:39.147 回答