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 peloTOP
cláusula.
Exemplo 3 – Use TOP com gravatas
Agora para os laços. Veja o que acontece se adicionarmosWITH 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 mesmoArtistId
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 oAlbumId
coluna para oORDER 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 especificamosWITH TIES
, nenhum está presente neste caso.
Exemplo 5 – Usando uma cláusula WHERE
Aqui está um último exemplo, onde eu uso umWHERE
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 |+------------+--------------+--------- ---+