Sql OrderBy子句在order列具有相同数据时生成不同的结果集
我们有一个存储过程来根据页码和页面大小返回一组记录。排序由列CreateDateTime完成。如果所有记录的CreatedDateTime值相同,则以不同的顺序给出结果集。这种行为前后不一致 部分代码:Sql OrderBy子句在order列具有相同数据时生成不同的结果集,sql,sql-server-2008,stored-procedures,sql-order-by,Sql,Sql Server 2008,Stored Procedures,Sql Order By,我们有一个存储过程来根据页码和页面大小返回一组记录。排序由列CreateDateTime完成。如果所有记录的CreatedDateTime值相同,则以不同的顺序给出结果集。这种行为前后不一致 部分代码: SET @FirstRec = ( @PageNo - 1 ) * @PageSize SET @LastRec = ( @PageNo *@PageSize + 1 ) SELECT * FROM ( select ROW_NUMBER() OVER (ORD
SET @FirstRec = ( @PageNo - 1 ) * @PageSize
SET @LastRec = ( @PageNo *@PageSize + 1 )
SELECT *
FROM
(
select ROW_NUMBER() OVER (ORDER BY CreatedDateTime)
AS rowNumber,EMPID
From Employee
) as KeyList
WHERE rowNumber > @FirstRec AND rowNumber < @LastRec
请提供一些相关信息。这是设计的
如果未指定ORDERBY子句,SQL Server或任何RDBMS都不保证以特定顺序返回结果。有些人认为,如果没有指定ORDERBY子句,行总是以聚集索引顺序或物理磁盘顺序返回。但是,这是不正确的,因为在查询处理过程中有许多因素会改变行顺序。对于更改行顺序的运算符来说,并行哈希联接是一个很好的示例
如果指定ORDERBY子句,SQL Server将对行进行排序并按请求的顺序返回它们。但是,如果由于存在重复的值而导致该顺序不确定,则在每个值组中,由于上述相同的原因,该顺序是随机的
保证确定性顺序的唯一方法是在ORDERBY子句中包含保证的唯一列或列组,例如主键 如果您排序依据的列中的值都相同,则无法保证它们将以相同的顺序检索。您可以按第二列排序-如果有唯一的id,可能是唯一的id?我在下面的代码中称之为UniqueId。这将确保顺序始终相同
SELECT *
FROM
(
select ROW_NUMBER() OVER (ORDER BY CreatedDateTime, UniqueId)
AS rowNumber,EMPID
From Employee
) as KeyList
WHERE rowNumber > @FirstRec AND rowNumber < @LastRec
如果需要可复制的顺序,则需要确保在order BY中指定足够的列,以便order BY中列出的所有列的组合对于每一行都是唯一的。例如,如果EmpID是主键,则添加EmpID,以充当具有相等CreatedDateTime值的行之间的联系断路器。您能否提供一些示例数据以了解什么是不一致性?这将首先按CreatedDateTime排序,然后按唯一id排序。因此,具有不同时间的条目的顺序肯定是正确的。您甚至不必使用RowNumber函数。上面的一个简单版本是像往常一样实现排序,并添加一个唯一的ID作为最后一个排序。例如,我有一些类似于通过CreatedDateTime从tmp顺序中选择*的内容,UniqueId偏移量10行仅获取下一个10行