Benutzer mit den meisten Antworten
Letzter Datensatz

Frage
-
Hallo Leute,
Ich kann per "select top..." die ersten x Datensätze einer Tabelle anzeigen lassen (z.B. im SQL Server Managemnent Studio).
Wie aber kann ich die letzten x Sätze erhalten ? Ich würde nämlich gerne in meiner Applikation die letzten 100
Datensätze darstellen. Und zwar ohne Index. Irgendwie find ich da nix.
Horst
Antworten
-
Hallo Horst,
TOP erfordert immer eine Sortierung, denn etwas wie erster / letzter Datensatz gibt es in einer relationalen Datenbank nicht.
Um die letzten Datenzeilen anzuzeigen sortiere die Daten entsprechend dem Kriterum absteigend, für die Northwind.Customers
-- die ersten 5 Kunden (nach Name) SELECT TOP (5) * FROM Customers ORDER BY CompanyName ASC -- die letzten 5 Kunden (nach Name) SELECT TOP (5) * FROM Customers ORDER BY CompanyName DESC
Ein Index ist dafür nicht notwendig, kann die Sache aber deutlich beschleunigen, wenn die Tabelle umfangreich ist.
Gruß Elmar
- Als Antwort vorgeschlagen Stefan FalzModerator Montag, 18. April 2011 11:49
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 28. April 2011 08:48
Alle Antworten
-
Hallo Horst,
TOP erfordert immer eine Sortierung, denn etwas wie erster / letzter Datensatz gibt es in einer relationalen Datenbank nicht.
Um die letzten Datenzeilen anzuzeigen sortiere die Daten entsprechend dem Kriterum absteigend, für die Northwind.Customers
-- die ersten 5 Kunden (nach Name) SELECT TOP (5) * FROM Customers ORDER BY CompanyName ASC -- die letzten 5 Kunden (nach Name) SELECT TOP (5) * FROM Customers ORDER BY CompanyName DESC
Ein Index ist dafür nicht notwendig, kann die Sache aber deutlich beschleunigen, wenn die Tabelle umfangreich ist.
Gruß Elmar
- Als Antwort vorgeschlagen Stefan FalzModerator Montag, 18. April 2011 11:49
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 28. April 2011 08:48
-
Danke Elmar,
wenn das so ist muss ich wohl ein Datumszeitfeld mitführne weil ich definitv die letzten 100 Sätze nach Eingabe
haben will. Oder gibt es da eine bessere Lösung ?
und wieso kann ich dann im SQL Server Management Studio bei Rechtsklick auf die Tabelle 'edit top 200'
oder auch 'Select top 1000 rows ' auswählen. Da kommen doch die ersten Sätze ?
Gruss Horst
-
Hallo Horst,
wenn das so ist muss ich wohl ein Datumszeitfeld mitführne weil ich definitv die letzten 100 Sätze nach Eingabe haben will. Oder gibt es da eine bessere Lösung ?
Wenn Du sowohl den Erstellungs- bzw. den letzten Änderungszeitpunkt als Sortierkriterium benötigst, wäre eine DateTime Spalte sicherlich sinnvoll.
Wenn es nur um die Anlage des Datensatzes selbst geht, wäre auch eine Identity Spalte möglich. Ob dir das aber ausreicht, musst Du selbst entscheiden.
und wieso kann ich dann im SQL Server Management Studio bei Rechtsklick auf die Tabelle 'edit top 200'
oder auch 'Select top 1000 rows ' auswählen. Da kommen doch die ersten Sätze ?
Nö. Da kommen die Datensätze, so wie sie vom DBMS geliefert werden. Dass die gerade zufällig evtl. deinem Sortiertriterium entsprechend zurückgegeben werden, ist dann Zufall. Darauf verlassen kannst Du dich nicht.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo Horst,
das relationale Modell basiert auf der Mengentheorie - vielleicht erinnerst Du Dich noch an die Mengenlehre in der Schule.
Als Beispiel:
Wenn Du einen Korb mit Äpfeln hast und einige hinzufügst oder wegnimmst, so kannst Du nicht sagen,
welcher der Äpfel der erste oder der letzte im Korb ist. Und so wie Du dort sagen musst:
Ich möchte die Äpfel der Größe, der Farbe (oder Zahl der Wurmlöcher ;-) nach,
so musst Du in SQL sagen, in dieser oder jener Sortierung (via ORDER BY).Wenn Du im SSMS[1] TOP (n) ohne Sortierung angibst, so verwendet der SQL Server den naheliegendsten Index
für eine Rückgabe, was im allgemeinen der (sortierte / CLUSTERED) Primärschlüssel ist. Die Reihenfolge ist
damit aber nicht zwingend festgelegt, da man dies durch Änderung des Schlüssels neusortieren würde.Gibt es keinen, verwendet er den für ihn intern schnellsten Zugriff anhand der internen Strukturen -
was bei Änderungen der physikalischer Anordnung eine andere sein kann, deswegen steht bei TOP auch:
"Falls die Abfrage keine ORDER BY-Klausel enthält, ist die Reihenfolge der Zeilen beliebig. "Willst Du also genau die Reihenfolge der Eingabe, so kommst Du letztendlich nicht um eine zusätzliche Spalte
mit einem Datum drumherum. Wobei man bei schnellen Rechnern damit rechnen sollte, dass die Auflösung
eines Datetime2 (theoretisch 100 ns, faktisch jedoch hardwareabhängig) nicht ausreicht, um das eineindeutig
zu unterscheiden und so zwei oder mehrere Zeilen als gleichzeitig eingefügt erscheinen.Wenn Du eine IDENTITY Spalte als Primärschlüssel verwendest, wäre es möglich den Wert (z. B. via DBCC CHECKIDENT)
zu verändern.Ein "Restrisiko" bleibt also immer.
Gruß Elmar
[1] Man sollte die Klammern um den Ausdruck bei TOP mit angegeben - auch wenn SSMS da noch schlampig ist,
so ist die Version ohne Klammern mittlerweile obsolet und nur aus Abwärtskompatiblität noch vorhanden. -
Mensch Elmar,
Du hast Dir wirklich viel Mühe gegeben so das sogar ich das kapiert habe.
Und ausserdem eine Menge Infos reingepackt. Dank Dir sehr dafür.
Das "Restrisiko" ist in meinem Fall dann gering und verschmerzbar, [1] werde ich
auch beachten
Gruß
Horst