Advanced T-SQL: WITH TIES

29. Juli 2014
Office Days sind bei der SDX AG monatlich etablierte Veranstaltungen, bei denen sich alle Mitarbeiter in den firmeninternen Räumlichkeiten zusammenfinden. Neben der Förderung und Stärkung der eXpert-Community dienen diese Events auch zum Informationsaustausch und Knowhow-Transfer zu diversen Themen zwischen den Kollegen.

An einem der letzten SDX Office Days habe ich eine Breakout-Session zum Thema “Advanced T-SQL” gehalten, bei dem ich einige spezielle Features der Abfragesprache T-SQL zeigen durfte. Zu diesem Vortrag gehörte u.a. auch die Vorstellung der “WITH TIES”-Option, welche zwar schon seit langer Zeit fester Bestandteil von T-SQL ist, zu meiner großen Überraschung aber dem ein oder anderen Kollegen noch nicht bekannt war.
Im Rahmen dieses Artikels soll gezeigt werden, dass auch im Bereich der Datenbank-Programmierung mit T-SQL beim Vergleichen und Sortieren von Werten bestimmte Bedingungen berücksichtigt werden müssen. Insbesondere wenn mit “SELECT TOP [N]”-Abfragen eine fixe Anzahl von Datensätzen aus der Datenbank auslesen werden, sollte bei mehreren möglichen Abfrageergebnissen (zumindest etwas) Vorsicht geboten sein.

Vorsicht bei SELECT TOP N

Folgende T-SQL-Syntax erlaub es, eine feste Anzahl von Datensätzen, welche nach bestimmten Eigenschaften sortiert sind, aus einem Datenbank-Objekt (z.B. Tabellen oder Views) abzufragen:
 
   1:  SELECT TOP [positivIntValue] [Column1], ... , [ColumnN]
   2:  FROM [DbObject]
   3:  ORDER BY [SortPredicate1] [ASC/DESC], ..., [SortPredicateN] [ASC/DESC]

So weit so gut: Doch was ist, wenn es mehrere mögliche Ergebnisse für ein solches “SELECT TOP N”-Statement mit entsprechendem Sortierkriterium gibt? Ab dem Absetzen des SQL-Befehls ist das Abfrageergebnis von der zugrundenliegenden Datenbank-Implementierung abhängig und kann nicht weiter beeinflusst werden.
Dass dieser Umstand durchaus Probleme mit sich bringen kann, soll folgende Gesamtmenge von günstigen (Klein-)Fahrzeugen Smiley in einer einfachen Tabelle dienen:
 

image_thumb9_thumb

Wenn die drei teuersten Autos ermittelt werden sollen, bietet sich zunächst folgendes T-SQL-Statement an:
 
   1:  SELECT TOP 3 
   2:  Color, Name, Price 
   3:  FROM TblCars 
   4:  ORDER BY Price DESC;
 
Das Problem, bei dieser Abfrage ist, dass sie für die Gesamtmenge mit den angegebene  5 Autos kein eindeutiges Ergebnis zurückliefern kann. Beide der folgenden Abbildungen enthalten Objekte mit den gesuchten Kriterien und stellen somit gültige Ergebnisse der vorherigen SQL-Abfrage dar:
 
image_thumb6
 
oder
image_thumb7

WITH TIES-OPTION

Wenn es mehrere Einträge gibt, die dem angegebenen Sortierkriterium entsprechen und bei der Abfrage mit Berücksichtigung finden sollen, bietet sich die “WITH TIES”-Option mit folgender Syntax an:
 
   1:  SELECT TOP [positivIntValue] 
   2:  WITH TIES [Column1], ..., [ColumnN]
   3:  FROM [DbObject]
   4:  ORDER BY [SortPredicate1] [ASC/DESC], [...], [SortPredicateN] [ASC/DESC]

Die drei teuersten Wagen aus dem aktuellen Beispiel können mit folgender T-SQL-Formulierung ermittelt werden:
 
   1:  SELECT TOP 3 
   2:  WITH TIES 
   3:  Color, Name, Price 
   4:  FROM TblCars
   5:  ORDER BY Price DESC;

Das Ergebnis dieser Abfrage liefert, wie die folgende Abbildung zeigt, alle Datenbankeinträge, die dem angegebene Sortierkriterium entsprechen entsprechen. Der Vorteil hierbei ist, dass insbesondere auch doppelte Einträge berücksichtigt werden. Außerdem ist dieses Abfrageergebnis komplett deterministisch und eindeutig wiederholbar.
 
image

Zusammenfassung

Natürlich hängt es immer vom konkreten Anwendungsfall ab, wie mehrere mögliche Abfrageergebnissen behandelt werden sollen. Wenn es aber darum geht, mehre alle Datensätze mit gleichen Sortierbedingungen zu ermitteln und man sich nicht auf die Willkür der eingesetzten Datenbank-Technologie verlassen will, dann ist die WITH TIES-Option eine valide Empfehlung.
Als praktische Anwendungsszenarien aus dem realen Alltag dienen beispielsweise Sportveranstaltungen wie die olympischen Spiele . Bei solchen Sport-Events muss im Gedanken an das sportliche Fairplay immer eine Antwort bzw. klare Regelung gefunden werden, wenn darum geht, gleiche Platzierungen entsprechend zu honorieren.

Quelle