0%

Präzise Fragen stellen · Übung

Gleichstände mit weiteren Sortierschlüsseln auflösen

Der Akkubohrer und der Klapptisch mit jeweils sieben Tagen liegen gleichauf. Nur loan_days DESC anzufordern kann nicht entscheiden, welcher zuerst kommt. Deshalb können zwei korrekte Durchläufe diese Zeilen an unterschiedlichen Positionen zeigen.

Gib SQLite genauere Anweisungen, indem du die aktuelle ORDER BY-Zeile durch diese ersetzt:

ORDER BY loan_days DESC, name ASC, id ASC;

Klicke auf Run. Die Zeilen mit sieben Tagen stehen weiterhin über der Zeile mit drei Tagen. Jetzt lösen ihre Namen den ersten Gleichstand auf:

TL-100 | Cordless drill | tools | 7
EV-101 | Folding table | events | 7
TL-220 | Step ladder | tools | 3

SQLite liest die Sortierschlüssel von links nach rechts. Es vergleicht zuerst loan_days, mit größeren Werten zuerst. Nur bei gleichen Leihdauern vergleicht es name, diesmal alphabetisch aufsteigend. Wenn sowohl Leihdauer als auch Name übereinstimmen, trifft id ASC die letzte Entscheidung.

Stell dir zwei Zeilen mit sieben Tagen und dem Namen Folding table vor, deren IDs 12 und 90 sind. Der erste Schlüssel ergibt einen Gleichstand, der zweite ebenfalls. SQLite erreicht den dritten Schlüssel und setzt ID 12 vor ID 90. Ein späterer Schlüssel hebt niemals eine Entscheidung auf, die ein früherer bereits getroffen hat.

Du hast id nicht zu den Ergebnisspalten hinzugefügt und musst das auch nicht. Eine Spalte kann helfen, die Antwort anzuordnen, ohne angezeigt zu werden. Das sichtbare Ergebnis konzentriert sich weiterhin auf Kennzeichen, Name, Kategorie und Leihdauer.

Warum nach dem Namen eine ID aufnehmen? Ein Katalog kann zwei unterschiedliche Gegenstände mit demselben menschenlesbaren Namen enthalten. „Folding table“ könnte mehrere physische Tische beschreiben, während ihre ausdrücklich angegebenen IDs sie weiterhin unterscheiden. Der letzte Schlüssel gibt jeder passenden Zeile einen stabilen Platz, auch wenn die vorherigen Werte gleich sind.

Auch die Richtungen sind bewusst gewählt. loan_days DESC stellt längere Leihdauern zuerst dar; name ASC und id ASC stellen bei einem Gleichstand kleinere Text- und ID-Werte zuerst dar. Die Reihenfolge dieser Schlüssel zu ändern verändert die Frage. Nach ID vor Name zu sortieren würde einen Gleichstand durch die IDs auflösen, bevor die Namen zum Zuge kommen.

Submit verwendet gleiche Leihdauern, wiederholte Namen und eine durcheinandergeratene Einfügereihenfolge. Prüfe die vollständige Liste hinter ORDER BY, statt nur die drei sichtbaren Zeilen zu beurteilen. Eine Abfrage kann bei diesem kleinen Katalog stabil aussehen und trotzdem einen Gleichstand unaufgelöst lassen.

Dein Ergebnis hat jetzt eine vollständige Reihenfolge. Jede passende Zeile hat eine vorhersehbare Position, weil für jeden möglichen Gleichstand ein späterer Schlüssel zur Auflösung bereitsteht.

Aufgabe

Ersetze die Sortierung nach einem Schlüssel in search.sql durch loan_days DESC, name ASC, id ASC.

Führe die Abfrage aus und reiche sie ein, nachdem du geprüft hast, dass die Sortierschlüssel in dieser Reihenfolge stehen.