Sql 为什么distinct不按顺序给出结果?

Sql 为什么distinct不按顺序给出结果?,sql,oracle,select,distinct,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; 可能的原因是什么? DISTINCT语句不应该以与表中记录相同的顺序返回记录吗?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; 
可能的原因是什么? DISTINCT语句不应该以与表中记录相同的顺序返回记录吗?

SELECT或DISTINCT都不定义数据的顺序

如果需要有序数据,请明确定义所需的顺序

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

在SELECT语句中使用ORDER BY:

SELECT DISTINCT record_group_id
FROM my_table2
WHERE rownum <=1000000
ORDER BY record_group_id;
使用DISTINCT不会影响顺序,只会影响值的唯一性

如果您也想控制订单:

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

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

然而,记录的存储方式并不保证它们将按该顺序被选择。execution planner确定运行查询的最有效方式,这意味着可能无法按您认为的方式获取数据,并且随着数据的更改或数据的统计信息的更改,数据可能会不时有所不同

对于像本例中这样的简单查询,通常会得到一个可预测的结果,但这并不能保证,因此始终需要在获取数据的位置对查询进行排序,以确保得到一个可预测的结果


在本例中,您没有按照数据存储在表中的顺序获取数据的一个原因可能是,索引用于过滤结果,记录是按照索引的顺序而不是表的顺序返回的。

您认为表中的数据是按顺序排列的,这是错误的。 数据库表中没有隐式排序——它只是一包未排序的数据


如果您需要有序数据,则必须使用ORDER BY-无法绕过它,既不能使用DISTINCT,也不能使用GROUP BY,也不能使用。。。,请参见

尝试按命令排序在SELECT语句上使用ORDER BY:从my_table2中选择不同的记录\u group\u id,其中rownum但SELECT语句不应按顺序返回不同的记录,这些记录应按顺序排序,因为它们在FORETABLE之前已排序,因此没有任何保证顺序。如果您想要一个特定的顺序,您必须在SELECT语句中指定它。@David:即使记录是按特定的顺序存储的,当您使用查询获取它们时,并不能保证您将按该顺序获取它们。因此,在这种情况下,执行计划员将从表中获取前1000000条记录,并以随机方式返回它们的组id?我认为您应该阅读@Guffa的答案,因为它解释了原因。
SELECT DISTINCT record_group_id
FROM my_table2
WHERE rownum <= 1000000
ORDER BY record_group_id -- Added this line