Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Datensätze zufällig sortieren

Geschrieben von: Christoph Wille
Kategorie: Datenbank

This printed page brought to you by AlphaSierraPapa

Klingt komisch, ist es aber nicht. Oftmals möchte man Datensätze einer Tabelle bei jedem Zugriff in unterschiedlicher Reihenfolge auslesen, um damit eine gewisse "Zufälligkeit" in die Anordnung der Datensätze zu bekommen. Da es keine ORDER Clause "ORDER BY RAND" gibt, muß man sich die Lösung selbst basteln.

Die Ansätze, die ich in diesem Artikel präsentiere, funktionieren nur mit Microsoft SQL Server 7.0 und höher.

Der falsche Ansatz - die RAND Funktion

Es gibt zwar kein ORDER BY RAND, dafür aber existiert die RAND Funktion, die einen Zufallswert liefert:

RAND ( [ seed ] ) 

Damit kann man dem Resultset eine neue Spalte verpassen, die mit Zufallswerten gefüllt wird. Dazu gibt es auch in der SQL Server Dokumentation ein entsprechendes Beispiel - ich habe es auf die authors Tabelle der pubs Datenbank angepasst:

SELECT RAND( (DATEPART(mm, GETDATE()) * 100000 )
           + (DATEPART(ss, GETDATE()) * 1000 )
           + DATEPART(ms, GETDATE()) ) As MyRandId,
         au_id, au_lname
         FROM authors
         ORDER BY MyRandId DESC

Wenn man das jetzt aber ausführt, so erhält man eine mehr oder minder böse Überraschung:

Sollten das nicht Zufallszahlen sein? Sind sie auch, allerdings liegt das Problem beim Seed: RAND liefert mathematische Zufallszahlen, also beim gleichen Seed fängt die Reihe der Zufallszahlen immer gleich an - und da die Abfrage extrem schnell ist, ändert sich der Seed nicht oder nur kaum. Daher sind die Zufallszahlen gleich oder ähnlich, und mit Zufall ist Essig. Und mit der zufälligen Sortierung erst recht.

GUID's to the rescue

Wenn man mit RAND keine Zufallszahlen bekommt, wie kann man dann sonst im SQL Server an Zufallszahlen herankommen? Hier helfen die bei COM Programmierern so allseits beliebten GUIDs (Globally Unique IDs) - diese sind 128 Bit Zahlen, in die die MAC Adresse der Netzwerkkarte, Zeit, usw eingerechnet werden, und die sich wirklich nicht wiederholen.

Der entsprechende Befehl zum Generieren einer GUID in SQL Server sieht wie folgt aus:

NEWID ( ) 

Die Anwendung ist ebenso einfach wie die Syntax:

SELECT NEWID() As MyRandId, au_id, au_lname
         FROM authors
         ORDER BY MyRandId DESC

Eine GUID ist zwar ein Zeichenmonster, aber sicher eindeutig, wie der nachfolgende Screenshot beweist.

Wie oft man auch die Query absetzt, die GUID's werden sich immer ändern, und man hat eine perfekt zufällige Reihenfolge der Datensätze garantiert.

Schlußbemerkung

Oft führen Wege zum Ziel, an die man im ersten Moment gar nicht gedacht hat. Dies trifft sicher für die verschiedenen Anwendungsmöglichkeiten einer GUID zu: zufällige Sortierungen, absolut eindeutige IDs und vieles mehr.

This printed page brought to you by AlphaSierraPapa

Verwandte Artikel

Optimiertes Erstellen von DropDowns
http:/www.aspheute.com/artikel/20040901.htm
Records zählen mit Stored Procedures
http:/www.aspheute.com/artikel/20010326.htm

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.