Подтвердить что ты не робот

Функция SQL Row_Number() в разделе Where без ORDER BY?

Я нашел кучу вопросов по этой теме с хорошими решениями, но ни один из них на самом деле не справляется с тем, что делать, если данные не должны быть упорядочены определенным образом. Например, следующий запрос:

WITH MyCte AS 
(
    select   employee_id,
             RowNum = row_number() OVER ( order by employee_id )
    from     V_EMPLOYEE 
    ORDER BY Employee_ID
)
SELECT  employee_id
FROM    MyCte
WHERE   RowNum > 0

работает хорошо, если данные должны быть заказаны сотрудником_id. Но что, если мои данные не имеют какого-либо определенного порядка, но сами номера строк действуют как идентификатор? Моя цель - написать такой запрос (с помощью функции Row_Number() без предложения ORDER BY):

WITH MyCte AS 
(
    select   employee_id,
             RowNum = row_number() OVER ( <PRESERVE ORIGINAL ORDER FROM DB> )
    from     V_EMPLOYEE 
    ORDER BY Employee_ID
)
SELECT  employee_id
FROM    MyCte
WHERE   RowNum > 0

РЕДАКТИРОВАТЬ: После Google, я понял, что это действительно невозможно. Может ли кто-нибудь предложить обходное решение для этого?

4b9b3361

Ответ 1

На всякий случай это полезно кому-то другому. Я просто понял это из в другом месте:

WITH MyCte AS 
(
    select   employee_id,
             RowNum = row_number() OVER (ORDER BY (SELECT 0))
    from     V_EMPLOYEE 
    ORDER BY Employee_ID
)
SELECT  employee_id
FROM    MyCte
WHERE   RowNum > 0

Ответ 2

Я использую это для подавления сортировки:

ORDER BY @@rowcount

@@rowcount является константой в запросе. Пример:

select N = row_number() over (order by @@rowcount) from sys.columns

Использование (выберите 0) в ORDER BY, кажется, выполняется намного медленнее.

Ответ 3

Реальная проблема с подходом, который вы предлагаете, заключается в том, что порядок в db не гарантируется. Он может случайно возвращаться в ваше приложение в том же порядке все время, но SQL Standard не гарантирует такой порядок и может меняться в зависимости от изменений версии или выпуска. Порядок данных с SQL Server не гарантируется без предложения order by. Этот дизайн был бы тем, который просто полагается на "удачу". Если это возможное изменение в порядке влияет на вашу реализацию, вы можете изменить его сейчас, прежде чем слишком заходить в реализацию.

Хорошая статья по этой теме

Ответ 4

Нет такой вещи, как ORIGINAL ORDER. SQL-сервер не может гарантировать порядок строк, если вы не укажете ORDER BY. Вы можете получить удачу и получить результаты в определенном порядке, но это может измениться в любое время.

Ответ 5

Там есть решение, которое проще, чем выше. Вы все равно можете использовать ROW_NUMBER, но произвольное значение в предложении Order by:

Select firstName, lastName, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) from tblPerson