2009-02-10 8 views
26

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

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

Спасибо заранее.

--edit К сожалению, забыл упомянуть, должны работать на SQL Server 2000

ответ

46

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

смотри также здесь Row Number

+4

Не забудьте оставить временную таблицу –

-1

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

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

Примечание: Если вы используете этот подход и добавить ИНЕК к наружному SELECT, вы должны добавить его в внутренний SELECT, также, если вы хотите, чтобы числа будут продолжением inuous.

+0

Это будет работать, как вы уже упоминали для каждой строки, которую он должен отсканировать всю таблицу, это также известно как счетчик бега – SQLMenace

+0

Да, это крупно сосательное решение. Однако при ограничении SQL2K это либо эта, либо временная таблица (уже предлагаемая в другом ответе). Я полагаю, это зависит от точного сценария, решение которого - меньшее зло. – JohnFx

+0

Сценарий: выбор нескольких тысяч строк из таблицы: _ ( – Rodrigo

2

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

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

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