我在 sql server 2008 中有一个非常奇怪的错误:
为了在 CRUD 应用程序详细信息 View 中显示寻呼机,我发出一个 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 。
欢迎任何帮助/想法/解决方法来解决这个问题,
提前致谢
最佳答案
这是一个猜测,但如果您有 FTE
的重复值值,则无法保证每次运行代码时它们会以何种顺序出现。 SQL Server 可能会在您执行简单的操作之间更改查询计划 SELECT
和一个 SELECT
与 WHERE
标准,导致出现不同的顺序以及您所看到的内容。
我会把PK加到你的ORDER BY
的末尾只是为了确保排序始终一致。
关于sql - 使用 ROW_NUMBER() OVER 十进制列时未确定的排序顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7919325/