SQL Смещение теряет свой порядок на SQL сервере - PullRequest
0 голосов
/ 08 января 2020

У меня есть отсортированная временная таблица с именем #MytempTable Сортировка была основана не только на конкретном c столбце, но и на многих других факторах

Теперь я хочу использовать OFFSET для разбиения на страницы

OFFSET @PageSize*(@PageNumber-1) Row Fetch Next @PageSize Rows Only

Но если я сделаю это так на моем временном столе, как показано ниже

Select * 
from #MytempTable 
ORDER BY ( SELECT NULL) OFFSET
@PageSize*(@PageNumber-1) Row Fetch Next @PageSize Rows Only

Порядок, который у меня был на временном столе, потерян.

Я хочу сохранить порядок временной таблицы после смещения.

Ответы [ 2 ]

1 голос
/ 08 января 2020

Нет порядка для таблицы. Даже для "временной таблицы".

Это фундаментальный принцип SQL: таблицы (и наборы результатов без *) 1005 *) представляют неупорядоченные наборы. Период. Информация о заказе фиксируется в данных с использованием столбцов в данных.

Набор результатов без ORDER BY может быть возвращен в любом порядке - и в других заказах при последующих выполнениях.

Когда вы добавляете ORDER BY (SELECT NULL), вы прямо заявляете: «Я должен поставить сюда ORDER BY, но мне нет дела до порядка». Это распространяется на следующее: «Мне все равно, будет ли оно одинаковым при последующих выполнениях.

Вы можете сохранить порядок при создании временной таблицы с использованием столбца идентификаторов. Например:

select identity(int) as temp_id, . . .
into #temp
from . . . 
order by <whatever you want here>;

Затем вы можете восстановить порядок, используя order by temp_id при запросе к таблице.

1 голос
/ 08 января 2020

Порядок никогда не гарантируется в наборе результатов, если вы не укажете Order By в запросе. Даже если вы хотите, чтобы результирующий набор был упорядочен по clustered key, он не может быть возвращен в этом порядке из-за многих факторов.

В вашем случае, я думаю, вы можете добавить один новый идентификатор (автозаполнение) столбец к вашему temp table, а во время select вы должны использовать этот столбец с предложением Order By вместо Order By (select null).

...