2009-02-10 13 views
26

Necesito, si es posible, una consulta t-sql que, al devolver los valores de una tabla arbitraria, también devuelve una columna de número entero incremental con valor = 1 para el primera fila, 2 para la segunda, y así sucesivamente.MSSQL Seleccionar instrucción con columna de número entero incremental ... no de una tabla

Esta columna no reside en realidad en cualquier mesa, y debe ser estrictamente incrementales, debido a que la cláusula ORDER BY podría ordenar las filas de la tabla y quiero la fila incrementales en perfecto estado siempre ...

Gracias por adelantado.

--edit Lo sentimos, se olvidó de mencionar, se deben ejecutar en SQL Server 2000

Respuesta

46

Para SQL 2005 y hasta

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

para el año 2000 que tiene que hacer algo como esto

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 

consulta aquí Row Number

+4

No olvides soltar la tabla temporal –

-1

Es feo y tiene un pobre rendimiento, pero técnicamente esto funciona en cualquier mesa con al menos un campo único y trabaja en SQL 2000.

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

Nota: Si se utiliza este enfoque y añadir una cláusula WHERE a la SELECT externa, tiene que añadirse a la SELECT interna también si desea que los números sean continuo.

+0

Eso funcionará, pero como ya lo mencionaste para cada fila, debe escanear toda la tabla, esto también se conoce como una cuenta corriente – SQLMenace

+0

Sí, es una solución muy sucky. Sin embargo, bajo la restricción de SQL2K es esta o la tabla temporal (ya se ofrece en otra respuesta). Supongo que depende del escenario exacto de qué solución es el mal menor. – JohnFx

+0

El escenario es: para seleccionar varios miles de filas de una tabla: _ ( – Rodrigo

2

Puede comenzar con un número personalizado y el incremento a partir de ahí, por ejemplo, desea añadir un número de cuenta para cada pago que puede hacer:

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

dará el número de cuenta correcto para cada fila.

Cuestiones relacionadas