none
Letzter Datensatz RRS feed

  • 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

    Montag, 18. April 2011 10:21

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

    Montag, 18. April 2011 10:30
    Beantworter

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

    Montag, 18. April 2011 10:30
    Beantworter
  • 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

     

    Montag, 18. April 2011 11:26
  • 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
    Montag, 18. April 2011 11:43
    Moderator
  • Prima Stefan,

    danke, hat mir geholfen

     

    grüsse

    Horst

     

    Montag, 18. April 2011 11:54
  • 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.

    Montag, 18. April 2011 12:14
    Beantworter
  • 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

     

    Montag, 18. April 2011 12:24