So generieren Sie ein automatisches Inkrementfeld in einer ausgewählten Abfrage


82

Zum Beispiel habe ich eine Tabelle mit 2 Spalten first_nameund last_namemit diesen Werten

Ali           Khani
Elizabette    Amini
Britney       Spears
,...

Ich möchte eine selectAbfrage schreiben , die eine Tabelle wie folgt generiert:

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

Danke für Ihre Hilfe.


1
Welches RDBMS verwenden Sie?
Peterm

Antworten:


143

Wenn es MySQL ist, können Sie es versuchen

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

SQLFiddle

Und für SQLServer

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

SQLFiddle


1
Was passiert , wenn ich will alle Spalten seleect aus table1statt first_nameund last_name, wie kann ich auf alle beziehen? Der Versuch SELECT @n := @n + 1 n, *funktioniert nicht
PlainOldProgrammer

Die Antwort istSELECT @n := @n + 1 n, table1.*
PlainOldProgrammer

1
In MYSQL müssen Sie möglicherweise @n initialisieren:SET @n = 0;
Francisco R

2
@FranciscoR Bitte schauen Sie genauer hin, es wurde bereits in der Unterabfrage initialisiert (SELECT @n := 0). Das Verborgene an diesem Ansatz ist, dass Sie eine einzige Anweisung anstelle von zwei haben. Dies ist gut, wenn mehrere Anweisungen in Ihrem Client-Code verboten sind.
Peterm

32

Hier ist, für SQL server, Oracle, PostgreSQLwelche Support-Fenster Funktionen.

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

4

Wenn Sie keinen natürlichen Partitionswert haben und unabhängig von der Partition nur eine geordnete Nummer möchten, können Sie einfach eine Zeilennummer über einer Konstanten erstellen. Im folgenden Beispiel habe ich gerade 'X' verwendet. Hoffe das hilft jemandem

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.