为什么distinct不会在订单中给出结果?

时间:2013-10-18 13:36:10

标签: sql oracle select distinct

我按照他们的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语句不应该以与表中相同的顺序返回记录吗?

5 个答案:

答案 0 :(得分:4)

SELECTDISTINCT都没有定义数据的顺序。

如果您希望有序数据明确定义您需要的Order

SELECT DISTINCT record_group_id 
FROM my_table2 
WHERE rownum <=1000000 
ORDER BY record_group_id; 

答案 1 :(得分:3)

排序仅确定插入表中的源数据的顺序。如果表中没有聚簇索引,则表示记录将按物理顺序存储。

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

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

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

答案 2 :(得分:1)

在SELECT语句中使用ORDER BY:

SELECT DISTINCT record_group_id
FROM my_table2
WHERE rownum <=1000000
ORDER BY record_group_id;

答案 3 :(得分:1)

使用DISTINCT不会影响订单,只会影响值的唯一性。

如果您也想控制订单:

SELECT DISTINCT record_group_id
FROM my_table2
WHERE rownum <= 1000000
ORDER BY record_group_id -- Added this line

答案 4 :(得分:0)

您假设表中的数据是有序的,这是错误的。 数据库表中有 no 隐式排序 - 它只是一包未排序的数据。

如果您需要订购数据,则必须使用ORDER BY - 无法绕过它(既不是DISTINCT也不是GROUP BY也不是......),请参阅TomKyte Blog on Order By

相关问题