2013-03-04 4 views
19

Я хочу определить начало ROW_NUMBER() как 3258170 вместо 1.Вручную укажите начальное значение для Row_Number()

Я использую следующий SQL запрос

SELECT ROW_NUMBER() over(order by (select 3258170)) as 'idd'. 

Однако приведенный выше запрос не работает. Когда я говорю, что не работает, я имею в виду его выполнение, но оно не начинается с 3258170. Может кто-нибудь мне помочь?

Причина, по которой я хочу указать номер строки, - это вставка строк из одной таблицы в другую. В первой таблице номер последней записи - 3258169, и когда я вставляю новые записи, я хочу, чтобы они имели номер строки от 3258170.

+0

0_0 Я не уверен, что такое возможно, но я ** уверен, что это ужасная идея. Что вы на самом деле пытаетесь достичь? SQL Server имеет автоинкрементные целые столбцы, не так ли? – 2013-03-04 20:03:05

+1

Вы не можете добавить первичный ключ с автоматическим увеличением, чтобы сохранить правильный идентификатор? –

+0

Да, я могу это сделать. Просто пытаюсь понять, есть ли другой способ. – Huzaifa

ответ

36

Просто добавьте значение результата row_number():

select 3258170 - 1 + row_number() over (order by (select NULL)) as idd 

Предложение о row_number()order by уточняет, что столбец используется для заказа по. Указав там константу, вы просто говорите: «все имеет то же значение для целей заказа». У него ничего нет, ничего общего с первым выбранным значением.

Чтобы избежать путаницы, я заменил постоянное значение на NULL. В SQL Server у меня есть , наблюдаемый, который присваивает порядковый номер без фактической сортировки строк - наблюдаемое преимущество в производительности, но не то, что я видел документально, поэтому мы не можем зависеть от него.

+0

Неправильно, если я укажу значение в select? – Huzaifa

+0

@John - вам нужно понять, что такое ROW_NUMBER() и что вы не можете присвоить ему значения. Вы можете только добавить к нему. Из документации Oracle: «ROW_NUMBER - это аналитическая функция. Он присваивает уникальный номер каждой строке, к которой он применяется (каждая строка в разделе или каждой строке, возвращаемой запросом), в упорядоченной последовательности строк, указанной в order_by_clause , начиная с 1. " – Art

+0

Для MySQL см. Ответ OMG Ponies: http://stackoverflow.com/questions/1895110/row-number-in-mysql –

3

Я чувствую, что это легче

ROW_NUMBER() OVER(ORDER BY Field) - 1 AS FieldAlias (To start from 0) 
ROW_NUMBER() OVER(ORDER BY Field) + 3258169 AS FieldAlias (To start from 3258170) 
0

Иногда ....

ROW_NUMBER() не может быть лучшим решением, особенно когда может быть повторяющихся записей в основной набор данных (JOIN запросы и т. д.). Это может привести к возврату большего количества строк, чем ожидалось. Вы можете рассмотреть возможность создания SEQUENCE, который может быть в некоторых случаях считаться более чистым решением. т.е .:

CREATE SEQUENCE myRowNumberId 
    START WITH 1 
    INCREMENT BY 1 
GO 

SELECT NEXT VALUE FOR myRowNumberId AS 'idd' -- your query 
GO 

DROP SEQUENCE myRowNumberId; -- just to clean-up after ourselves 
GO 

Недостатком является то, что последовательности может быть трудно использовать в сложных запросов с отчетливыми, оконных функций и т.д. Смотрите полную документацию последовательности here.

Смежные вопросы