2013-02-17 2 views
6

Wie kann ich die Anzahl der Zeilen in einer Tabelle so anzeigen, dass beim Hinzufügen eines neuen Datensatzes die Zahl, die die Zeile darstellt, höher wird und wenn ein Datensatz gelöscht wird, wird die Nummer entsprechend aktualisiert?
Um mehr klar zu sein, nehme ich eine einfache Tabelle wie folgt aus:Wie kann ich jeder Zeile in einer Tabelle, die die Datensatznummer darstellt, eine Nummer zuweisen?

ID int (Primärschlüssel) Name varchar (5)

Die ID gesetzt wird selbst erhalten erhöht (mit Identitätsangabe), so dass es nicht, wenn I haben beispielsweise 3 Datensätze, da die Anzahl der Reihe (record) darstellen als:

ID BEZEICHNUNG
1 Alex
2 Scott
3 Sara

und ich Alex und Scott löschen und einen neuen Datensatz hinzufügen wird es sein:

3 Sara 
4 Mina 

Also im Grunde suche ich nach einer SQL-Side-Lösung, dies zu tun, so dass Ich ändere nichts anderes im Quellcode an mehreren Stellen.

Ich habe versucht, etwas zu schreiben, um die Arbeit zu erledigen, aber es failes. Hier ist sie:

SELECT  COUNT(*) AS [row number],Name 
FROM   dbo.Test 
GROUP BY ID, Name 
HAVING  (ID = ID) 

Dies zeigt, wie:

row number   Name 
1      Alex 
1      Scott 
1      Sara 

während ich es will, wie gezeigt zu erhalten:

row number   Name 
1      Alex 
2      Scott 
3      Sara 
+0

Was haben Sie versucht und wo möchten Sie keine Zeilen anzeigen? – DevelopmentIsMyPassion

+0

Ich habe die Frage aktualisiert. Ich möchte die Zahlen anzeigen, wenn ich Select-Befehle verwende.so dass jedes Mal, wenn ich die Ergebnisse auswähle, sie eine normale Nummerierung haben, die Datensätze darstellt. – Breeze

+0

Können Sie nicht einfach die ID anzeigen, die in der Zeilennummernspalte generiert wurde? Nicht verstanden, was ist die Verwendung von count (*) – DevelopmentIsMyPassion

Antwort

8

Wenn Sie nur die Nummer gegen den Zeilen möchten, während die Daten auswählen und nicht in der Datenbank können Sie diese verwenden

select row_number() over(order by id) from dbo.Test 

Dies wird die Zeilennummer n für n-ten Reihe geben.

+0

Warum bekomme ich "Das OVER SQL Konstrukt oder die Anweisung wird nicht unterstützt." Error ? (hab es, ich sollte das nicht im Designer laufen lassen :)) – Breeze

+0

ja du hast es richtig gemacht! – Saksham

2

Was Sie wollen, ist ein Auto-Inkrement bezeichnet.

Für SQL-Server wird dies erreicht, indem das Attribut IDENTITY(1,1) der Tabellendefinition hinzugefügt wird.

Andere RDBMS verwenden eine andere Syntax. Firebird zum Beispiel hat Generatoren, die das Zählen machen. In einem BEFORE-INSERT-Trigger würden Sie das ID-Feld dem aktuellen Wert des Generators zuweisen (der automatisch erhöht wird).

+0

Ich weiß das und ich benutze es jetzt, das Problem mit der Identität (1,1) ist, dass, wenn ich Datensätze aleardy und löschen Sie diese (angenommen ID Nummer 1) und neu starten werde ich bekomme diese Nummer 1 nicht mehr als ID, auch wenn keine Einträge vorhanden sind! Wenn ich 3 Datensätze als (1 2 3, und lösche Nummer zwei, sie wird als (1 3) ich möchte sie zu "zeigen" als (1 2) – Breeze

+0

Warum willst du das? Ok, nehme an, Sie wollen es Verwenden Sie dann einen Trigger und eine zweite Tabelle, die die gelöschten IDs enthält. – alzaimar

+0

Wie könnte ich das tun? Abgesehen davon, dass es noch sinnvoller ist, row_number() in diesem Szenario zu verwenden? – Breeze

0

ich genau dieses Problem vor einiger Zeit hatte, aber ich wurde mit SQL Server 2000, so dass, obwohl die Zeilennummer() ist die beste Lösung, in SQL Server 2000 nicht verfügbar: . Eine Problemumgehung dafür besteht darin, eine temporäre Tabelle zu erstellen, alle Werte mit automatischem Inkrement einzufügen und die aktuelle Tabelle durch die neue Tabelle in T-SQL zu ersetzen.