一尘不染

当使用带领带的ROW_NUMBER()OVER小数列时不确定的排序顺序

sql

我在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;

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

我不认为这很有趣,但是Vw_HrEmployee是一个View。

欢迎任何帮助您解决问题的想法/想法/解决方法,

提前致谢


阅读 187

收藏
2021-03-08

共1个答案

一尘不染

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

我会在您的末尾添加PK,ORDER BY以确保顺序始终保持一致。

2021-03-08