Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como incluir resultados empatados em último lugar ao usar a cláusula TOP no SQL Server


Ao usar o TOP cláusula em uma consulta no SQL Server, você pode encontrar ocasiões em que dois ou mais resultados empatam em último lugar. Você provavelmente nem saberia quando isso acontece, porque o comportamento padrão de TOP é retornar não mais do que o número de linhas que você especificar.

O TOP cláusula aceita um WITH TIES argumento que permite especificar se deve ou não incluir todos os resultados empatados em último lugar. As linhas podem ficar em último lugar devido ao seu ORDER BY coluna contendo o mesmo valor. O uso desse argumento pode, portanto, resultar em mais linhas sendo retornadas do que você realmente especificou.


Exemplo 1 – Os dados


Primeiro, aqui estão os dados com os quais trabalharemos nos exemplos a seguir:
SELECT AlbumId, AlbumName, ArtistId FROM Albums;

Resultado:
+-----------+--------------------------+----------- -----+| AlbumId | Nome do álbum | ArtistId ||-----------+--------------------------+-------- ----|| 1 | Powerslave | 1 || 2 | Potência | 2 || 3 | Cantando na pista | 6 || 4 | Ziltoid, o Onisciente | 5 || 5 | Vítimas de Cool | 5 || 6 | Epicloud | 5 || 7 | Em algum lugar no tempo | 1 || 8 | Pedaço de Mente | 1 || 9 | Assassinos | 1 || 10 | Nenhuma oração para os moribundos | 1 || 11 | Sem som sem silêncio | 9 || 12 | Big Swing Face | 4 || 13 | Noite Azul | 12 || 14 | Eternidade | 12 || 15 | Escandinávia | 12 || 16 | Mala perdida há muito tempo | 7 || 17 | Louvor e Culpa | 7 || 18 | Junto veio Jones | 7 || 19 | Toda a noite errado | 3 || 20 | Os Dezesseis Homens de Tain | 3 || 21 | Ei Wassup | 9 || 22 | Preso | 9 |+-----------+--------------------------+----------- ----+

Exemplo 2 – Use TOP sem laços


Veja o que acontece se usarmos TOP sem especificando WITH TIES . Esta é a forma como a maioria das pessoas usa esta cláusula.

Nesse caso, ordeno os resultados por ArtistId .
SELECT TOP(3) AlbumId, AlbumName, ArtistId FROM AlbumsORDER BY ArtistId ASC;

Resultado:
+-----------+-------------------+------------+| AlbumId | Nome do álbum | ArtistId ||-----------+-------------------+------------|| 1 | Powerslave | 1 || 7 | Em algum lugar no tempo | 1 || 8 | Pedaço de Mente | 1 |+-----------+-------------------+----------------+ 
Como esperado, obtemos três linhas. Estes são os três primeiros conforme especificado pelo TOP cláusula.

Exemplo 3 – Use TOP com gravatas


Agora para os laços. Veja o que acontece se adicionarmos WITH TIES .
SELECT TOP(3) WITH TIES AlbumId, AlbumName, ArtistId FROM AlbumsORDER BY ArtistId ASC;

Resultado:
+------------+--------------+-------- ----+| AlbumId | Nome do álbum | ArtistId ||------------+-------------------------+------ ---|| 1 | Powerslave | 1 || 7 | Em algum lugar no tempo | 1 || 8 | Pedaço de Mente | 1 || 9 | Assassinos | 1 || 10 | Nenhuma oração para os moribundos | 1 |+------------+--------------+--------- ---+

Agora temos cinco linhas em vez de apenas três. Isso ocorre porque há mais duas linhas que compartilham o mesmo ArtistId como a terceira linha. Em outras palavras, três fileiras estavam empatando em último lugar.

Observe que no SQL Server, a ordem retornada de amarrar linhas é arbitrária.

Exemplo 4 – Cláusula ORDER BY modificada para eliminar empates


Se adicionarmos o AlbumId coluna para o ORDER BY cláusula, isso elimina completamente os laços.
SELECT TOP(3) WITH TIES AlbumId, AlbumName, ArtistId FROM AlbumsORDER BY ArtistId ASC, AlbumId ASC;

Resultado:
+-----------+-------------------+------------+| AlbumId | Nome do álbum | ArtistId ||-----------+-------------------+------------|| 1 | Powerslave | 1 || 7 | Em algum lugar no tempo | 1 || 8 | Pedaço de Mente | 1 |+-----------+-------------------+----------------+ 
Então, mesmo quando especificamos WITH TIES , nenhum está presente neste caso.

Exemplo 5 – Usando uma cláusula WHERE


Aqui está um último exemplo, onde eu uso um WHERE cláusula para extrair um monte de linhas do meio da tabela. O primeiro exemplo é sem laços e o segundo é com laços.

Sem laços:
SELECT TOP(4) AlbumId, AlbumName, ArtistId FROM AlbumsWHERE AlbumId> 10ORDER BY ArtistId ASC;

Resultado:
+------------+--------------+-------- ----+| AlbumId | Nome do álbum | ArtistId ||------------+-------------------------+------ ---|| 19 | Toda a noite errado | 3 || 20 | Os Dezesseis Homens de Tain | 3 || 12 | Big Swing Face | 4 || 16 | Mala perdida há muito tempo | 7 |+------------+--------------+--------- ---+

Com laços:
SELECT TOP(4) WITH TIES AlbumId, AlbumName, ArtistId FROM AlbumsWHERE AlbumId> 10ORDER BY ArtistId ASC;

Resultado:
+------------+--------------+-------- ----+| AlbumId | Nome do álbum | ArtistId ||------------+-------------------------+------ ---|| 19 | Toda a noite errado | 3 || 20 | Os Dezesseis Homens de Tain | 3 || 12 | Big Swing Face | 4 || 16 | Mala perdida há muito tempo | 7 || 17 | Louvor e Culpa | 7 || 18 | Junto veio Jones | 7 |+------------+--------------+--------- ---+