Функция 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, я понял, что это действительно невозможно. Может ли кто-нибудь предложить обходное решение для этого?
Ответы
Ответ 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