使用ROW_NUMBER()OVER带有关系的十进制列时的未确定的排序顺序

Gui*_*e86 3 sql sql-server sql-server-2008 pager

我对sql server 2008有一个非常奇怪的错误:

要在CRUD应用程序详细信息视图中显示寻呼机,我发出sql请求以获取相对于当前的前一条和下一条记录,除了在DECIMAL列上排序时,它可以正常工作,我可以将问题减少到该查询(FTE是十进制的(18,2)):

WITH [IndexedRows] AS (
    SELECT 
        [ContactId], 
        [ContactCode],
        [FTE],
        [EmployeeName], 
        ROW_NUMBER() OVER ( ORDER BY [FTE] ASC ) AS [RowIndex]
    FROM   
        [Vw_HrEmployee]
)

/* 1. I can see ContactId 1109 is rowindex 7 */
/*SELECT * FROM [IndexedRows];*/

/* 2. Get the RowIndex, it returns 7 */
/*SELECT [RowIndex] 
FROM   [IndexedRows] 
WHERE  [ContactId] = 1109;*/

/* 3. Why it doesn't returns ContactId 1109 ??? */
SELECT [ContactId], 
       [EmployeeName] 
FROM   [IndexedRows] 
WHERE [RowIndex] = 7;
Run Code Online (Sandbox Code Playgroud)

我得到了另一个具有相同FTE值的人的contactId,但我不明白为什么WHERE rowindex没有返回正确的行(如果我显示IndexedRows,它看起来不错!).

我不认为这是令人讨厌的,但Vw_HrEmployee是一个视图.

任何帮助/想法/解决方法来解决这个问题都是受欢迎的,

提前致谢

Tom*_*m H 6

这是一个猜测,但如果您有值的重复值,FTE那么无法保证每次运行代码时它们将以何种顺序出现.SQL Server可能会在您执行简单操作SELECTSELECT使用WHERE条件时更改查询计划,从而导致出现不同的顺序以及您看到的内容.

我会将PK添加到您ORDER BY刚才的末尾,以确保排序始终一致.


p.c*_*ell 5

也许添加另一个排序标准来帮助确保正确/期望的顺序?

ROW_NUMBER() OVER ( ORDER BY [FTE] ASC, 
                             BirthDate ASC, 
                             AstrologySign DESC ) AS [RowIndex] 
Run Code Online (Sandbox Code Playgroud)