我对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是一个观点。
欢迎任何帮助/想法/解决方法,
提前致谢
答案 0 :(得分:6)
这是猜测,但如果您有FTE
值的重复值,则无法保证每次运行代码时它们将以何种顺序出现。 SQL Server可能会在您使用SELECT
条件执行简单SELECT
和WHERE
之间更改查询计划,导致出现不同的订单以及您看到的内容。
我会将PK添加到ORDER BY
的末尾,以确保排序始终一致。
答案 1 :(得分:5)
或许添加另一个排序标准以帮助确保正确/期望的订单?
ROW_NUMBER() OVER ( ORDER BY [FTE] ASC,
BirthDate ASC,
AstrologySign DESC ) AS [RowIndex]