Når du bruger TOP
klausul i en forespørgsel i SQL Server, kan du støde på situationer, hvor to eller flere resultater er uafgjort til sidstepladsen. Du ville sandsynligvis ikke engang vide, hvornår dette sker, fordi standardadfærden for TOP
er at returnere ikke mere end det antal rækker, du angiver.
TOP
klausul accepterer en WITH TIES
argument, der giver dig mulighed for at angive, om du vil inkludere alle resultater, der er lige til sidstepladsen. Rækker kan give uafgjort til sidste plads på grund af deres ORDER BY
kolonne med samme værdi. Brug af dette argument kan derfor resultere i, at der returneres flere rækker, end du faktisk har angivet.
Eksempel 1 – Dataene
For det første er her de data, vi vil arbejde med i følgende eksempler:
VÆLG AlbumId, AlbumName, ArtistId FROM Albums;
Resultat:
+------+----------------------------+------ -----+| AlbumId | Albumnavn | ArtistId ||-----------+--------------------------------+-------- ----|| 1 | Powerslave | 1 || 2 | Powerage | 2 || 3 | Singing Down the Lane | 6 || 4 | Ziltoid den alvidende | 5 || 5 | Ofre af Cool | 5 || 6 | Epicloud | 5 || 7 | Et eller andet sted i tiden | 1 || 8 | Piece of Mind | 1 || 9 | Mordere | 1 || 10 | Ingen bøn for døende | 1 || 11 | Ingen lyd uden stilhed | 9 || 12 | Big Swing Face | 4 || 13 | Blå nat | 12 || 14 | Evigheden | 12 || 15 | Skandinavien | 12 || 16 | Langt tabt kuffert | 7 || 17 | Ros og skyld | 7 || 18 | Sammen kom Jones | 7 || 19 | Hele natten forkert | 3 || 20 | De seksten mænd fra Tain | 3 || 21 | Yo Wassup | 9 || 22 | Busted | 9 |+-----------+--------------------------------+-------- ----+
Eksempel 2 – Brug TOP uden bånd
Her er, hvad der sker, hvis vi bruger TOP
uden med angivelse af WITH TIES
. Det er den måde, de fleste mennesker bruger denne klausul på.
I dette tilfælde bestiller jeg resultaterne efter ArtistId
.
VÆLG TOP(3) AlbumId, AlbumName, ArtistId FROM AlbumsORDER BY ArtistId ASC;
Resultat:
+------+--------------------+-----------+| AlbumId | Albumnavn | ArtistId ||-----------+--------------------+------------|| 1 | Powerslave | 1 || 7 | Et eller andet sted i tiden | 1 || 8 | Piece of Mind | 1 |+-----------+--------------------+------------+Som forventet får vi tre rækker. Disse er de tre øverste som angivet af
TOP
klausul.Eksempel 3 – Brug TOP med slips
Nu til båndene. Her er, hvad der sker, hvis vi tilføjer
WITH TIES
.VÆLG TOP(3) MED BÅND AlbumId, AlbumName, ArtistId FRA AlbumsORDER BY ArtistId ASC;Resultat:
+------+-------------------------+-------- ----+| AlbumId | Albumnavn | ArtistId ||-----------+--------------------------------+-------- ---|| 1 | Powerslave | 1 || 7 | Et eller andet sted i tiden | 1 || 8 | Piece of Mind | 1 || 9 | Mordere | 1 || 10 | Ingen bøn for døende | 1 |+-----------+-------------------------+--------- ---+Vi får nu fem rækker i stedet for kun tre. Dette skyldes, at der er to rækker mere, der deler det samme
ArtistId
som tredje række. Med andre ord var tre rækker uafgjort til sidstepladsen.Bemærk, at i SQL Server er den returnerede rækkefølge af bindingsrækker vilkårlig.
Eksempel 4 – En ændret ORDER BY-klausul for at eliminere bånd
Hvis vi tilføjer
AlbumId
kolonnen tilORDER BY
klausul, eliminerer dette båndene helt.VÆLG TOP(3) MED BÅND AlbumId, AlbumName, ArtistId FRA AlbumsORDER BY ArtistId ASC, AlbumId ASC;Resultat:
+------+--------------------+-----------+| AlbumId | Albumnavn | ArtistId ||-----------+--------------------+------------|| 1 | Powerslave | 1 || 7 | Et eller andet sted i tiden | 1 || 8 | Piece of Mind | 1 |+-----------+--------------------+------------+Så selv når vi angiver
WITH TIES
, ingen er til stede i dette tilfælde.Eksempel 5 – Brug af en WHERE-klausul
Her er et sidste eksempel, hvor jeg bruger en
WHERE
klausul for at udtrække en masse rækker fra midten af bordet. Det første eksempel er uden bånd, og det andet er med bånd.Uden bånd:
VÆLG TOP(4) AlbumId, AlbumName, ArtistId FROM AlbumsWHERE AlbumId> 10ORDER BY ArtistId ASC;Resultat:
+------+-------------------------+-------- ----+| AlbumId | Albumnavn | ArtistId ||-----------+--------------------------------+-------- ---|| 19 | Hele natten forkert | 3 || 20 | De seksten mænd fra Tain | 3 || 12 | Big Swing Face | 4 || 16 | Langt tabt kuffert | 7 |+-----------+-------------------------+--------- ---+Med slips:
VÆLG TOP(4) MED BÅND AlbumId, AlbumName, ArtistId FRA AlbumsWHERE AlbumId> 10ORDER BY ArtistId ASC;Resultat:
+------+-------------------------+-------- ----+| AlbumId | Albumnavn | ArtistId ||-----------+--------------------------------+-------- ---|| 19 | Hele natten forkert | 3 || 20 | De seksten mænd fra Tain | 3 || 12 | Big Swing Face | 4 || 16 | Langt tabt kuffert | 7 || 17 | Ros og skyld | 7 || 18 | Sammen kom Jones | 7 |+-----------+-------------------------+--------- ---+