Datensätze zufällig sortieren
Geschrieben von: Christoph Wille 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 FunktionEs 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 rescueWenn 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ßbemerkungOft 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. Verwandte Artikel
Optimiertes Erstellen von DropDowns Wenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |