Неопределенный порядок сортировки при использовании десятичного столбца ROW_NUMBER () OVER со связями - PullRequest
3 голосов
/ 27 октября 2011

У меня очень странная ошибка в 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;

Я получаю contactId другого человека с таким же значением FTE,но я не понимаю, почему WHERE rowindex не возвращает правильную строку (если я отображаю IndexedRows, это выглядит хорошо!).

Я не думаю, что это здорово, но Vw_HrEmployee - это представление.

Любая помощь / идея / обходной путь для решения, который приветствуется,

Заранее спасибо

Ответы [ 2 ]

6 голосов
/ 27 октября 2011

Это предположение, но если у вас есть повторяющиеся значения для значения FTE, то нет гарантии, в каком порядке они будут появляться при каждом запуске кода.SQL Server, вероятно, меняет план запроса между тем, когда вы делаете простые SELECT и SELECT с критериями WHERE, в результате чего появляется другой порядок и то, что вы видите.

Я быдобавьте PK в конец вашего ORDER BY, чтобы убедиться, что порядок всегда соответствует.

5 голосов
/ 27 октября 2011

Возможно, добавьте еще один критерий сортировки, чтобы обеспечить правильный / желаемый порядок?

ROW_NUMBER() OVER ( ORDER BY [FTE] ASC, 
                             BirthDate ASC, 
                             AstrologySign DESC ) AS [RowIndex] 
...