Я работаю на SQL Server 2008, используя NHibernate в качестве уровня персистентности (хотя эта проблема, по-моему, является чисто SQL).Почему ROW_NUMBER OVER (ORDER BY column) возвращает другой порядок результата, чем только столбец ORDER BY?
Я сводился моей проблема к следующему SQL заявлению:
SELECT TOP 2
this_.Id as Id36_0_,
this_.Name as Name36_0_,
ROW_NUMBER() OVER (ORDER BY this_.IsActive) as MyOrder
FROM Campsites this_
ORDER BY this_.IsActive /* a bit field */
Это часть запроса, который генерирует NH для получения постраничного результирующего набора. Данное заявление дает мне следующий результат:
Id36_0_ Name36_0_ MyOrder
9806 Camping A Cassagnau 1
8869 Camping a la ferme La Bergamotte 2
Однако, если опустить ROW_NUMBER() OVER (ORDER BY this_.IsActive) - который является тем, что создает NH для получения результатов на первой странице - я получаю два совершенно разные записи таблицы в моем результате:
SELECT TOP 2
this_.Id as Id36_0_,
this_.Name as Name36_0_
/* ROW_NUMBER() OVER(ORDER BY this_.IsActive) as MyOrder */
FROM Campsites this_
ORDER BY this_.IsActive /* a bit field */
возвращает
Id36_0_ Name36_0_
22876 Centro Vacanze Pra delle Torri
22135 Molecaten Park Napoleon Hoeve
Это совершенно сбивает с толком меня и приводит к ошибке в нашем приложении, где я получаю ту же запись кемпинга в качестве первый элемент на первой и второй странице нашего поиска.
Почему одно и то же предложение ORDER BY работает по-разному в выражении ROW_NUMBER OVER()?
странно, потому что для диалекта 2005 года столбец row_number всегда называется '__hibernate_sort_row', а порядок всегда использует этот столбец. – dotjoe