sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan medtager du resultater, der stemmer overens med sidstepladsen, når du bruger TOP-klausulen i SQL Server

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 til ORDER 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 |+-----------+-------------------------+--------- ---+

  1. Postgres mangler FROM-klausulindtastningsfejl på forespørgsel med WITH-klausul

  2. Hvordan kommer jeg i top 1 i Oracle?

  3. MySQL Group By og Sum total værdi af anden kolonne

  4. Hvad er triggere i SQL, og hvordan implementeres dem?