Оператор MSSQL Select с инкрементным целочисленным столбцом не из таблицы

Мне нужен, если возможно, запрос t-sql, который, возвращая значения из произвольной таблицы, также возвращает инкрементный целочисленный столбец со значением = 1 для первой строки, 2 для второй и так далее.

Этот столбец на самом деле не находится ни в одной таблице и должен быть строго инкрементным, потому что предложение ORDER BY может сортировать строки таблицы, и я хочу, чтобы инкрементная строка всегда была в идеальной форме...

Заранее спасибо.

--EDIT Извините, забыл упомянуть, должен работать на SQL Server 2000


person Rodrigo    schedule 10.02.2009    source источник


Ответы (4)


Для SQL 2005 и выше

SELECT ROW_NUMBER() OVER( ORDER BY SomeColumn ) AS 'rownumber',*
    FROM YourTable

для 2000 нужно сделать что-то вроде этого

SELECT IDENTITY(INT, 1,1) AS Rank ,VALUE
INTO #Ranks FROM YourTable WHERE 1=0

INSERT INTO #Ranks
SELECT SomeColumn  FROM YourTable
ORDER BY SomeColumn 

SELECT * FROM #Ranks
Order By Ranks

см. также здесь Номер строки

person SQLMenace    schedule 10.02.2009
comment
Не забудьте скинуть временную таблицу - person Joel Coehoorn; 11.02.2009

Вы можете начать с пользовательского номера и увеличивать его, например, вы хотите добавить контрольный номер для каждого платежа, который вы можете сделать:

select @StartChequeNumber = 3446;
SELECT 
((ROW_NUMBER() OVER(ORDER BY AnyColumn)) + @StartChequeNumber ) AS 'ChequeNumber'
,* FROM YourTable

даст правильный контрольный номер для каждой строки.

person Israel Margulies    schedule 01.05.2013

Попробуйте ROW_NUMBER()

http://msdn.microsoft.com/en-us/library/ms186734.aspx

Пример:

SELECT
  col1,
  col2,
  ROW_NUMBER() OVER (ORDER BY col1) AS rownum
FROM tbl
person Misko    schedule 10.02.2009
comment
Извините, забыл упомянуть, должен работать на SQL 2000 - person Rodrigo; 11.02.2009

Это уродливо и плохо работает, но технически это работает для любой таблицы хотя бы с одним уникальным полем И работает в SQL 2000.

SELECT (SELECT COUNT(*) FROM myTable T1 WHERE T1.UniqueField<=T2.UniqueField) as RowNum, T2.OtherField
FROM myTable T2
ORDER By T2.UniqueField

Примечание. Если вы используете этот подход и добавляете предложение WHERE во внешний SELECT, вы также должны добавить его во внутренний SELECT, если хотите, чтобы числа были непрерывными.

person JohnFx    schedule 10.02.2009
comment
Это будет работать, но, как вы уже упоминали, для каждой строки она должна сканировать всю таблицу, это также известно как текущий счет. - person SQLMenace; 11.02.2009
comment
Да, это в основном отстойное решение. Однако при ограничении SQL2K это либо это, либо временная таблица (уже предложенная в другом ответе). Я полагаю, это зависит от конкретного сценария, какое решение является меньшим злом. - person JohnFx; 11.02.2009
comment
Сценарий такой: выбрать несколько тысяч строк из таблицы :_( - person Rodrigo; 11.02.2009