Cómo generar un campo de incremento automático en una consulta de selección

83

Por ejemplo, tengo una tabla con 2 columnas first_namey last_namecon estos valores

Ali           Khani
Elizabette    Amini
Britney       Spears
,...

Quiero escribir una selectconsulta que genere una tabla como esta:

1     Ali           Khani
2     Elizabette    Amini
3     Britney       Spears
,...

Gracias por tu ayuda.

wf Khani
fuente
1
¿Qué RDBMS estás usando?
peterm

Respuestas:

145

Si es MySql puedes probar

SELECT @n := @n + 1 n,
       first_name, 
       last_name
  FROM table1, (SELECT @n := 0) m
 ORDER BY first_name, last_name

SQLFiddle

Y para SQLServer

SELECT row_number() OVER (ORDER BY first_name, last_name) n,
       first_name, 
       last_name 
  FROM table1 

SQLFiddle

peterm
fuente
1
¿Qué sucede si quiero seleccionar todas las columnas de en su table1lugar first_namey last_namecómo puedo hacer referencia a todas? Intentar SELECT @n := @n + 1 n, *no funciona
PlainOldProgrammer
La respuesta esSELECT @n := @n + 1 n, table1.*
PlainOldProgrammer
1
En MYSQL, es posible que deba inicializar @n: SET @n = 0;
Francisco R
2
@FranciscoR Por favor, mire más de cerca, ya se ha inicializado en la subconsulta (SELECT @n := 0). La belleza oculta de este enfoque es que tiene una sola declaración en lugar de dos, lo cual es bueno cuando se prohíben varias declaraciones en su código de cliente.
peterm
33

aquí está para SQL server, Oracle, PostgreSQLqué funciones de la ventana de soporte.

SELECT  ROW_NUMBER() OVER (ORDER BY first_name, last_name)  Sequence_no,
        first_name,
        last_name
FROM    tableName
John Woo
fuente
4

En el caso de que no tenga un valor de partición natural y solo desee un número ordenado independientemente de la partición, puede simplemente hacer un número de fila sobre una constante, en el siguiente ejemplo acabo de usar 'X'. Espero que esto ayude a alguien

select 
    ROW_NUMBER() OVER(PARTITION BY num ORDER BY col1) as aliascol1, 
    period_next_id, period_name_long
from 
(
  select distinct col1, period_name_long, 'X' as num
  from {TABLE} 
) as x
balgar jagpal
fuente
1
DECLARE @id INT 
SET @id = 0 
UPDATE cartemp
SET @id = CarmasterID = @id + 1 
GO
Dev3
fuente