2009-02-10 1 views
26

Ich brauche, wenn möglich, eine t-SQL-Abfrage, die bei Rückgabe der Werte aus einer beliebigen Tabelle eine inkrementelle Ganzzahlspalte mit Wert = 1 zurückgibt erste Reihe, 2 für die zweite und so weiter.MSSQL Select-Anweisung mit inkrementeller Integer-Spalte ... nicht aus einer Tabelle

Diese Spalte tatsächlich in keine Tabelle befindet, und muß strikt inkrementell, da die ORDER BY-Klausel immer die Zeilen der Tabelle sortieren könnte, und ich mag die inkrementelle Zeile in perfekter Form ...

Dank im Voraus.

--edit Sorry, vergessen, zu erwähnen, müssen

Antwort

46

Für SQL 2005 und

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

für das Jahr 2000 müssen Sie so etwas wie diese

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 

siehe auch hier Row Number

+4

Vergessen Sie nicht, die temporäre Tabelle zu löschen –

-1

Es ist hässlich und führt schlecht zu tun, aber technisch funktioniert dies auf einer Tabelle mit mindestens einem einzigartigen Gebiet und arbeitet in SQL 2000.

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

Hinweis: wenn Sie diesen Ansatz verwenden, und fügen Sie eine WHERE-Klausel zu der äußeren SELECT, man muss hinzugefügt, um es auf die innere SELECT auch, wenn Sie die Zahlen sein wollen kontinuierlich.

+0

Das wird funktionieren, aber wie Sie bereits erwähnt für jede Zeile muss es die gesamte Tabelle scannen, wird dies auch bekannt eine laufende Zählung – SQLMenace

+0

Ja, es ist eine überwiegend sucky Lösung. Unter der Einschränkung von SQL2K ist dies jedoch entweder diese oder die temporäre Tabelle (die bereits in einer anderen Antwort angeboten wird). Ich nehme an, es hängt vom genauen Szenario ab, welche Lösung das kleinere Übel ist. – JohnFx

+0

Das Szenario ist: mehrere tausend Zeilen aus einer Tabelle auswählen: _ ( – Rodrigo

2

Sie können mit einem benutzerdefinierten Zahlen und Zuwachs von dort zum Beispiel Sie starten einen Scheck für jede Zahlung hinzufügen, die Sie tun können:

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

wird die richtige Schecknummer für jede Zeile geben.

Verwandte Themen