sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man inkluderar resultat som ligger på sista plats när man använder TOP-klausulen i SQL Server

När du använder TOP klausul i en fråga i SQL Server, kan du stöta på tillfällen där två eller flera resultat liknar sista plats. Du skulle förmodligen inte ens veta när detta händer, eftersom standardbeteendet för TOP är att inte returnera mer än det antal rader du anger.

TOP klausul accepterar en WITH TIES argument som låter dig ange om du ska inkludera alla resultat som ligger jämnt på sista plats. Rader kan vara lika för sista plats på grund av deras ORDER BY kolumn som innehåller samma värde. Att använda detta argument kan därför resultera i att fler rader returneras än vad du faktiskt angav.

Exempel 1 – Uppgifterna

Först, här är data vi kommer att arbeta med i följande exempel:

VÄLJ AlbumId, AlbumName, ArtistId FRÅN Album;

Resultat:

+------+--------------------------+------- -----+| AlbumId | Albumnamn | ArtistId ||-----------+--------------------------------+-------- ----|| 1 | Powerslave | 1 || 2 | Powerage | 2 || 3 | Singing Down the Lane | 6 || 4 | Ziltoid den Allvetande | 5 || 5 | Förluster av Cool | 5 || 6 | Epicloud | 5 || 7 | Någonstans i tiden | 1 || 8 | Piece of Mind | 1 || 9 | Mördare | 1 || 10 | Ingen bön för de döende | 1 || 11 | Inget ljud utan tystnad | 9 || 12 | Big Swing Face | 4 || 13 | Blå natt | 12 || 14 | Evigheten | 12 || 15 | Skandinavien | 12 || 16 | Långt borttappad resväska | 7 || 17 | Beröm och skuld | 7 || 18 | Med kom Jones | 7 || 19 | Hela natten fel | 3 || 20 | De sexton männen från Tain | 3 || 21 | Yo Wassup | 9 || 22 | Busted | 9 |+-----------+--------------------------------+-------- ----+

Exempel 2 – Använd TOP utan slipsar

Så här händer om vi använder TOP utan anger WITH TIES . Det är så de flesta använder den här klausulen.

I det här fallet sorterar jag resultaten efter ArtistId .

VÄLJ TOP(3) AlbumId, AlbumName, ArtistId FROM AlbumsORDER BY ArtistId ASC;

Resultat:

+-------+--------------------+-----------+| AlbumId | Albumnamn | ArtistId ||-----------+--------------------+------------|| 1 | Powerslave | 1 || 7 | Någonstans i tiden | 1 || 8 | Piece of Mind | 1 |+-----------+--------------------+------------+ 

Som väntat får vi tre rader. Dessa är de tre bästa som specificeras av TOP klausul.

Exempel 3 – Använd TOP med slipsar

Nu till slipsarna. Så här händer om vi lägger till WITH TIES .

VÄLJ TOP(3) MED TIES AlbumId, AlbumName, ArtistId FROM AlbumsORDER BY ArtistId ASC;

Resultat:

+------+-------------------------+-------- ----+| AlbumId | Albumnamn | ArtistId ||-----------+--------------------------------+-------- ---|| 1 | Powerslave | 1 || 7 | Någonstans i tiden | 1 || 8 | Piece of Mind | 1 || 9 | Mördare | 1 || 10 | Ingen bön för de döende | 1 |+-----------+--------------------------------+--------- ---+

Vi får nu fem rader istället för bara tre. Detta beror på att det finns ytterligare två rader som delar samma ArtistId som tredje raden. Tre rader var med andra ord oavgjort om sista plats.

Observera att i SQL Server är den returnerade ordningen för kopplingsrader godtycklig.

Exempel 4 – En modifierad ORDER BY-klausul för att eliminera band

Om vi ​​lägger till AlbumId kolumnen till ORDER BY klausul eliminerar detta banden helt och hållet.

VÄLJ TOP(3) MED TIES AlbumId, AlbumName, ArtistId FROM AlbumsORDER BY ArtistId ASC, AlbumId ASC;

Resultat:

+-------+--------------------+-----------+| AlbumId | Albumnamn | ArtistId ||-----------+--------------------+------------|| 1 | Powerslave | 1 || 7 | Någonstans i tiden | 1 || 8 | Piece of Mind | 1 |+-----------+--------------------+------------+ 

Så även när vi anger WITH TIES , inga är närvarande i det här fallet.

Exempel 5 – Använda en WHERE-klausul

Här är ett sista exempel, där jag använder en WHERE klausul för att extrahera ett gäng rader från mitten av tabellen. Det första exemplet är utan band, och det andra är med slipsar.

Utan band:

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

Resultat:

+------+-------------------------+-------- ----+| AlbumId | Albumnamn | ArtistId ||-----------+--------------------------------+-------- ---|| 19 | Hela natten fel | 3 || 20 | De sexton männen från Tain | 3 || 12 | Big Swing Face | 4 || 16 | Lång förlorad resväska | 7 |+-----------+-------------------------+--------- ---+

Med slipsar:

VÄLJ TOP(4) MED TIES AlbumId, AlbumName, ArtistId FROM AlbumsWHERE AlbumId> 10ORDER BY ArtistId ASC;

Resultat:

+------+-------------------------+-------- ----+| AlbumId | Albumnamn | ArtistId ||-----------+--------------------------------+-------- ---|| 19 | Hela natten fel | 3 || 20 | De sexton männen från Tain | 3 || 12 | Big Swing Face | 4 || 16 | Långt borttappad resväska | 7 || 17 | Beröm och skuld | 7 || 18 | Med kom Jones | 7 |+-----------+--------------------------------+--------- ---+

  1. CAST(DATETIME AS DATE) över WHERE-satsen

  2. 6 sätt att ta bort dubbletter av rader som har en primärnyckel i Oracle

  3. SqlDependency aktiverar inte OnChange-händelsen när datauppsättningen ändras

  4. gå med kommaavgränsad datakolumn