Jak wygenerować pole automatycznego przyrostu w zapytaniu wybierającym


84

Na przykład mam tabelę z 2 kolumnami first_namei last_nametymi wartościami

Ali           Khani
Elizabette    Amini
Britney       Spears
,...

Chcę napisać selectzapytanie, które wygeneruje następującą tabelę:

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

Dzięki za pomoc.


1
Jakich systemów RDBMS używasz?
peterm

Odpowiedzi:


147

Jeśli to MySql, możesz spróbować

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

SQLFiddle

I dla SQLServer

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

SQLFiddle


1
Co jeśli chcę table1zamiast tego wybrać wszystkie kolumny z first_namei last_namejak mogę się do nich odwołać? Próbowanie SELECT @n := @n + 1 n, *nie działa
PlainOldProgrammer

Odpowiedź brzmiSELECT @n := @n + 1 n, table1.*
PlainOldProgrammer

1
W MYSQL może być konieczne zainicjowanie @n: SET @n = 0;
Francisco R

2
@FranciscoR Przyjrzyj się bliżej, zostało już zainicjowane w podzapytaniu (SELECT @n := 0). Ukryte piękno tego podejścia polega na tym, że zamiast dwóch masz jedną instrukcję, co jest dobre, gdy wiele instrukcji jest zabronionych w kodzie klienta.
peterm

33

tutaj jest SQL server, Oracle, PostgreSQLwsparcie dla funkcji okien.

SELECT  ROW_NUMBER() OVER (ORDER BY first_name, last_name)  Sequence_no,
        first_name,
        last_name
FROM    tableName

4

W przypadku, gdy nie masz naturalnej wartości partycji i po prostu potrzebujesz uporządkowanej liczby niezależnie od partycji, możesz po prostu wykonać wiersz_numer na stałej, w poniższym przykładzie właśnie użyłem „X”. Mam nadzieję, że to komuś pomoże

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

1
DECLARE @id INT 
SET @id = 0 
UPDATE cartemp
SET @id = CarmasterID = @id + 1 
GO
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.