Функция SQL Row_Number () в предложении Where без ORDER BY? - PullRequest
42 голосов
/ 17 июня 2011

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

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

хорошо работает, если данные упорядочены по employee_id. Но что, если мои данные не имеют определенного порядка, но сами номера строк действуют как 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

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

Ответы [ 5 ]

93 голосов
/ 17 июня 2011

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

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
22 голосов
/ 25 апреля 2013

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

ORDER BY @@rowcount

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

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

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

6 голосов
/ 17 июня 2011

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

Хорошая статья на эту тему

4 голосов
/ 17 июня 2011

ОРИГИНАЛЬНОГО ЗАКАЗА не существует.SQL-сервер не может гарантировать порядок строк, если вы не укажете ORDER BY.Вам может повезти и вы получите результаты в определенном порядке, но он может измениться в любое время.

2 голосов
/ 03 августа 2017

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

Select firstName, lastName, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) from tblPerson
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...