Оператор MSSQL Select с инкрементным целочисленным столбцом ... не из таблицы
-
22-08-2019 - |
Вопрос
Мне нужен, если возможно, запрос t-sql, который, возвращая значения из произвольной таблицы, также возвращает инкрементный целочисленный столбец со значением = 1 для первой строки, 2 для второй и так далее.
Этот столбец фактически не находится ни в одной таблице и должен быть строго инкрементным, потому что предложение ORDER BY может сортировать строки таблицы, а я хочу, чтобы инкрементная строка всегда была в идеальной форме...
Заранее благодарю.
--РЕДАКТИРОВАТЬ Извините, забыл упомянуть, должен выполняться на SQL Server 2000
Решение
Для 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
смотрите также здесь Номер строки
Другие советы
Вы можете начать с пользовательского номера и увеличивать его, например, вы хотите добавить номер чека для каждого платежа, который вы можете выполнить:
select @StartChequeNumber = 3446;
SELECT
((ROW_NUMBER() OVER(ORDER BY AnyColumn)) + @StartChequeNumber ) AS 'ChequeNumber'
,* FROM YourTable
выдаст правильный номер чека для каждой строки.
Попробуйте ROW_NUMBER()
http://msdn.microsoft.com/en-us/library/ms186734.aspx
Пример:
SELECT
col1,
col2,
ROW_NUMBER() OVER (ORDER BY col1) AS rownum
FROM tbl
Это некрасиво и плохо работает, но технически это работает с любой таблицей, имеющей хотя бы одно уникальное поле, И работает в 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, если вы хотите, чтобы числа были непрерывными.