Bij gebruik van de TOP
clausule in een query in SQL Server, kan het voorkomen dat twee of meer resultaten op de laatste plaats eindigen. Je zou waarschijnlijk niet eens weten wanneer dit gebeurt, omdat het standaardgedrag van TOP
is om niet meer terug te geven dan het aantal rijen dat u opgeeft.
De TOP
clausule accepteert een WITH TIES
argument waarmee u kunt specificeren of u al dan niet alle resultaten wilt opnemen die gelijk zijn aan de laatste plaats. Rijen kunnen gelijk eindigen voor de laatste plaats vanwege hun ORDER BY
kolom met dezelfde waarde. Het gebruik van dit argument kan er daarom toe leiden dat er meer rijen worden geretourneerd dan u daadwerkelijk hebt opgegeven.
Voorbeeld 1 – De gegevens
Ten eerste, hier zijn de gegevens waarmee we zullen werken in de volgende voorbeelden:
SELECT AlbumId, AlbumName, ArtistId FROM Albums;
Resultaat:
+-----------+--------------------------+------------+ | AlbumId | AlbumName | ArtistId | |-----------+--------------------------+------------| | 1 | Powerslave | 1 | | 2 | Powerage | 2 | | 3 | Singing Down the Lane | 6 | | 4 | Ziltoid the Omniscient | 5 | | 5 | Casualties of Cool | 5 | | 6 | Epicloud | 5 | | 7 | Somewhere in Time | 1 | | 8 | Piece of Mind | 1 | | 9 | Killers | 1 | | 10 | No Prayer for the Dying | 1 | | 11 | No Sound Without Silence | 9 | | 12 | Big Swing Face | 4 | | 13 | Blue Night | 12 | | 14 | Eternity | 12 | | 15 | Scandinavia | 12 | | 16 | Long Lost Suitcase | 7 | | 17 | Praise and Blame | 7 | | 18 | Along Came Jones | 7 | | 19 | All Night Wrong | 3 | | 20 | The Sixteen Men of Tain | 3 | | 21 | Yo Wassup | 9 | | 22 | Busted | 9 | +-----------+--------------------------+------------+
Voorbeeld 2 – Gebruik TOP zonder banden
Dit is wat er gebeurt als we TOP
gebruiken zonder specificeren van WITH TIES
. Dit is de manier waarop de meeste mensen deze clausule gebruiken.
In dit geval bestel ik de resultaten op ArtistId
.
SELECT TOP(3) AlbumId, AlbumName, ArtistId FROM Albums ORDER BY ArtistId ASC;
Resultaat:
+-----------+-------------------+------------+ | AlbumId | AlbumName | ArtistId | |-----------+-------------------+------------| | 1 | Powerslave | 1 | | 7 | Somewhere in Time | 1 | | 8 | Piece of Mind | 1 | +-----------+-------------------+------------+
Zoals verwacht krijgen we drie rijen. Dit is de top drie zoals gespecificeerd door de TOP
clausule.
Voorbeeld 3 – Gebruik TOP met stropdassen
Nu voor de banden. Dit is wat er gebeurt als we WITH TIES
toevoegen .
SELECT TOP(3) WITH TIES AlbumId, AlbumName, ArtistId FROM Albums ORDER BY ArtistId ASC;
Resultaat:
+-----------+-------------------------+------------+ | AlbumId | AlbumName | ArtistId | |-----------+-------------------------+------------| | 1 | Powerslave | 1 | | 7 | Somewhere in Time | 1 | | 8 | Piece of Mind | 1 | | 9 | Killers | 1 | | 10 | No Prayer for the Dying | 1 | +-----------+-------------------------+------------+
We krijgen nu vijf rijen in plaats van slechts drie. Dit komt omdat er nog twee rijen zijn die dezelfde ArtistId
. delen als de derde rij. Met andere woorden, drie rijen gingen gelijk op voor de laatste plaats.
Houd er rekening mee dat in SQL Server de geretourneerde volgorde van het binden van rijen willekeurig is.
Voorbeeld 4 – Een gewijzigde ORDER BY-clausule om banden te elimineren
Als we de AlbumId
. toevoegen kolom naar de ORDER BY
clausule, dit elimineert de banden helemaal.
SELECT TOP(3) WITH TIES AlbumId, AlbumName, ArtistId FROM Albums ORDER BY ArtistId ASC, AlbumId ASC;
Resultaat:
+-----------+-------------------+------------+ | AlbumId | AlbumName | ArtistId | |-----------+-------------------+------------| | 1 | Powerslave | 1 | | 7 | Somewhere in Time | 1 | | 8 | Piece of Mind | 1 | +-----------+-------------------+------------+
Dus zelfs als we WITH TIES
specify specificeren , in dit geval zijn er geen aanwezig.
Voorbeeld 5 – Een WHERE-clausule gebruiken
Hier is nog een laatste voorbeeld, waarbij ik een WHERE
. gebruik clausule om een aantal rijen uit het midden van de tabel te extraheren. Het eerste voorbeeld is zonder stropdassen en het tweede is met stropdassen.
Zonder stropdassen:
SELECT TOP(4) AlbumId, AlbumName, ArtistId FROM Albums WHERE AlbumId > 10 ORDER BY ArtistId ASC;
Resultaat:
+-----------+-------------------------+------------+ | AlbumId | AlbumName | ArtistId | |-----------+-------------------------+------------| | 19 | All Night Wrong | 3 | | 20 | The Sixteen Men of Tain | 3 | | 12 | Big Swing Face | 4 | | 16 | Long Lost Suitcase | 7 | +-----------+-------------------------+------------+
Met stropdassen:
SELECT TOP(4) WITH TIES AlbumId, AlbumName, ArtistId FROM Albums WHERE AlbumId > 10 ORDER BY ArtistId ASC;
Resultaat:
+-----------+-------------------------+------------+ | AlbumId | AlbumName | ArtistId | |-----------+-------------------------+------------| | 19 | All Night Wrong | 3 | | 20 | The Sixteen Men of Tain | 3 | | 12 | Big Swing Face | 4 | | 16 | Long Lost Suitcase | 7 | | 17 | Praise and Blame | 7 | | 18 | Along Came Jones | 7 | +-----------+-------------------------+------------+