Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So schließen Sie Ergebnisse ein, die für den letzten Platz stehen, wenn Sie die TOP-Klausel in SQL Server verwenden

Bei Verwendung des TOP -Klausel in einer Abfrage in SQL Server, kann es vorkommen, dass zwei oder mehr Ergebnisse den letzten Platz einnehmen. Sie würden wahrscheinlich nicht einmal wissen, wann dies passiert, da das Standardverhalten von TOP soll nicht mehr als die von Ihnen angegebene Anzahl von Zeilen zurückgeben.

Die TOP -Klausel akzeptiert ein WITH TIES -Argument, mit dem Sie angeben können, ob alle Ergebnisse auf dem letzten Platz berücksichtigt werden sollen oder nicht. Zeilen können aufgrund ihres ORDER BY den letzten Platz einnehmen Spalte mit dem gleichen Wert. Die Verwendung dieses Arguments kann daher dazu führen, dass mehr Zeilen zurückgegeben werden, als Sie tatsächlich angegeben haben.

Beispiel 1 – Die Daten

Hier sind zunächst die Daten, mit denen wir in den folgenden Beispielen arbeiten werden:

SELECT AlbumId, AlbumName, ArtistId AUS Alben;

Ergebnis:

+-----------+---------------------+------- -----+| Album-ID | Albumname | ArtistId ||-----------+---------------------+-------- ----|| 1 | Machtsklave | 1 || 2 | Powerage | 2 || 3 | Singen auf der Gasse | 6 || 4 | Ziltoid der Allwissende | 5 || 5 | Opfer von Cool | 5 || 6 | Epiwolke | 5 || 7 | Irgendwo in der Zeit | 1 || 8 | Seelenfrieden | 1 || 9 | Mörder | 1 || 10 | Kein Gebet für die Sterbenden | 1 || 11 | Kein Ton ohne Stille | 9 || 12 | Großes Schwunggesicht | 4 || 13 | Blaue Nacht | 12 || 14 | Ewigkeit | 12 || 15 | Skandinavien | 12 || 16 | Lange verlorener Koffer | 7 || 17 | Lob und Tadel | 7 || 18 | Da kam Jones | 7 || 19 | Die ganze Nacht falsch | 3 || 20 | Die sechzehn Männer von Tain | 3 || 21 | Yo Wasup | 9 || 22 | Gesprengt | 9 |+-----------+---------------------+-------- ----+

Beispiel 2 – TOP ohne Bindungen verwenden

Folgendes passiert, wenn wir TOP verwenden ohne Angabe von WITH TIES . Auf diese Weise verwenden die meisten Leute diese Klausel.

In diesem Fall ordne ich die Ergebnisse nach ArtistId .

SELECT TOP(3) AlbumId, AlbumName, ArtistId FROM AlbumsORDER BY ArtistId ASC;

Ergebnis:

+---+------+----+| Album-ID | Albumname | ArtistId ||-----------+-------------+------------|| 1 | Machtsklave | 1 || 7 | Irgendwo in der Zeit | 1 || 8 | Seelenfrieden | 1 |+-----------+---------------------------+-----------+ 

Wie erwartet erhalten wir drei Zeilen. Dies sind die ersten drei, wie durch TOP angegeben Klausel.

Beispiel 3 – Verwenden Sie OBEN mit Bindungen

Nun zu den Krawatten. Folgendes passiert, wenn wir WITH TIES hinzufügen .

SELECT TOP(3) WITH TIES AlbumId, AlbumName, ArtistId FROM AlbumsORDER BY ArtistId ASC;

Ergebnis:

+-----------+-------------------------+-------- ----+| Album-ID | Albumname | ArtistId ||-----------+-------------------------+--------- ---|| 1 | Machtsklave | 1 || 7 | Irgendwo in der Zeit | 1 || 8 | Seelenfrieden | 1 || 9 | Mörder | 1 || 10 | Kein Gebet für die Sterbenden | 1 |+-----------+-------------------------+--------- ---+

Wir bekommen jetzt fünf Zeilen statt nur drei. Dies liegt daran, dass es zwei weitere Zeilen gibt, die dieselbe ArtistId teilen als dritte Reihe. Mit anderen Worten, es gab drei Reihen um den letzten Platz.

Beachten Sie, dass in SQL Server die zurückgegebene Reihenfolge der Zeilenbindung willkürlich ist.

Beispiel 4 – Eine modifizierte ORDER BY-Klausel zur Eliminierung von Bindungen

Wenn wir die AlbumId hinzufügen in die Spalte ORDER BY Klausel, wodurch die Bindungen vollständig beseitigt werden.

SELECT TOP(3) WITH TIES AlbumId, AlbumName, ArtistId FROM AlbumsORDER BY ArtistId ASC, AlbumId ASC;

Ergebnis:

+---+------+----+| Album-ID | Albumname | ArtistId ||-----------+-------------+------------|| 1 | Machtsklave | 1 || 7 | Irgendwo in der Zeit | 1 || 8 | Seelenfrieden | 1 |+-----------+---------------------------+-----------+ 

Also auch wenn wir WITH TIES angeben , in diesem Fall sind keine vorhanden.

Beispiel 5 – Verwendung einer WHERE-Klausel

Hier ist ein letztes Beispiel, wo ich ein WHERE verwende -Klausel, um eine Reihe von Zeilen aus der Mitte der Tabelle zu extrahieren. Das erste Beispiel ist ohne Bindungen, das zweite mit Bindungen.

Ohne Bindungen:

SELECT TOP(4) AlbumId, AlbumName, ArtistId FROM AlbumsWHERE AlbumId> 10ORDER BY ArtistId ASC;

Ergebnis:

+-----------+-------------------------+-------- ----+| Album-ID | Albumname | ArtistId ||-----------+-------------------------+--------- ---|| 19 | Die ganze Nacht falsch | 3 || 20 | Die sechzehn Männer von Tain | 3 || 12 | Großes Schwunggesicht | 4 || 16 | Lange verlorener Koffer | 7 |+-----------+-------------------------+--------- ---+

Mit Krawatten:

SELECT TOP(4) WITH TIES AlbumId, AlbumName, ArtistId FROM AlbumsWHERE AlbumId> 10ORDER BY ArtistId ASC;

Ergebnis:

+-----------+-------------------------+-------- ----+| Album-ID | Albumname | ArtistId ||-----------+-------------------------+--------- ---|| 19 | Die ganze Nacht falsch | 3 || 20 | Die sechzehn Männer von Tain | 3 || 12 | Großes Schwunggesicht | 4 || 16 | Lange verlorener Koffer | 7 || 17 | Lob und Tadel | 7 || 18 | Da kam Jones | 7 |+-----------+-------------------------+--------- ---+