Оператор MSSQL Select с добавочным целочисленным столбцом ... не из таблицы - PullRequest
33 голосов
/ 11 февраля 2009

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

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

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

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

Ответы [ 4 ]

55 голосов
/ 11 февраля 2009

для 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

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

4 голосов
/ 01 мая 2013

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

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

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

2 голосов
/ 11 февраля 2009

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

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

Пример:

SELECT
  col1,
  col2,
  ROW_NUMBER() OVER (ORDER BY col1) AS rownum
FROM tbl
0 голосов
/ 11 февраля 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, если вы хотите, чтобы числа были непрерывными.

...