Al usar el TOP
cláusula en una consulta en SQL Server, puede encontrar ocasiones en las que dos o más resultados empatan en el último lugar. Probablemente ni siquiera sepa cuándo sucede esto, porque el comportamiento predeterminado de TOP
es devolver no más que el número de filas que especifique.
El TOP
cláusula acepta un WITH TIES
argumento que le permite especificar si incluir o no todos los resultados que empatan en el último lugar. Las filas pueden empatar en el último lugar debido a su ORDER BY
columna que contiene el mismo valor. Por lo tanto, el uso de este argumento puede dar como resultado que se devuelvan más filas de las que realmente especificó.
Ejemplo 1:los datos
Primero, estos son los datos con los que trabajaremos en los siguientes ejemplos:
SELECT AlbumId, AlbumName, ArtistId FROM Albums;
Resultado:
+-----------+--------------------------+------------+ | AlbumId | AlbumName | ArtistId | |-----------+--------------------------+------------| | 1 | Powerslave | 1 | | 2 | Powerage | 2 | | 3 | Singing Down the Lane | 6 | | 4 | Ziltoid the Omniscient | 5 | | 5 | Casualties of Cool | 5 | | 6 | Epicloud | 5 | | 7 | Somewhere in Time | 1 | | 8 | Piece of Mind | 1 | | 9 | Killers | 1 | | 10 | No Prayer for the Dying | 1 | | 11 | No Sound Without Silence | 9 | | 12 | Big Swing Face | 4 | | 13 | Blue Night | 12 | | 14 | Eternity | 12 | | 15 | Scandinavia | 12 | | 16 | Long Lost Suitcase | 7 | | 17 | Praise and Blame | 7 | | 18 | Along Came Jones | 7 | | 19 | All Night Wrong | 3 | | 20 | The Sixteen Men of Tain | 3 | | 21 | Yo Wassup | 9 | | 22 | Busted | 9 | +-----------+--------------------------+------------+
Ejemplo 2:usar TOP sin corbatas
Esto es lo que sucede si usamos TOP
sin especificando WITH TIES
. Esta es la forma en que la mayoría de la gente usa esta cláusula.
En este caso ordeno los resultados por ArtistId
.
SELECT TOP(3) AlbumId, AlbumName, ArtistId FROM Albums ORDER BY ArtistId ASC;
Resultado:
+-----------+-------------------+------------+ | AlbumId | AlbumName | ArtistId | |-----------+-------------------+------------| | 1 | Powerslave | 1 | | 7 | Somewhere in Time | 1 | | 8 | Piece of Mind | 1 | +-----------+-------------------+------------+
Como era de esperar, obtenemos tres filas. Estos son los tres primeros según lo especificado por TOP
cláusula.
Ejemplo 3:use TOP con corbatas
Ahora para los lazos. Esto es lo que sucede si agregamos WITH TIES
.
SELECT TOP(3) WITH TIES AlbumId, AlbumName, ArtistId FROM Albums ORDER BY ArtistId ASC;
Resultado:
+-----------+-------------------------+------------+ | AlbumId | AlbumName | ArtistId | |-----------+-------------------------+------------| | 1 | Powerslave | 1 | | 7 | Somewhere in Time | 1 | | 8 | Piece of Mind | 1 | | 9 | Killers | 1 | | 10 | No Prayer for the Dying | 1 | +-----------+-------------------------+------------+
Ahora tenemos cinco filas en lugar de solo tres. Esto se debe a que hay dos filas más que comparten el mismo ArtistId
como la tercera fila. En otras palabras, tres filas estaban empatadas en el último lugar.
Tenga en cuenta que en SQL Server, el orden devuelto de vinculación de filas es arbitrario.
Ejemplo 4:una cláusula ORDER BY modificada para eliminar empates
Si añadimos el AlbumId
columna a ORDER BY
cláusula, esto elimina las ataduras por completo.
SELECT TOP(3) WITH TIES AlbumId, AlbumName, ArtistId FROM Albums ORDER BY ArtistId ASC, AlbumId ASC;
Resultado:
+-----------+-------------------+------------+ | AlbumId | AlbumName | ArtistId | |-----------+-------------------+------------| | 1 | Powerslave | 1 | | 7 | Somewhere in Time | 1 | | 8 | Piece of Mind | 1 | +-----------+-------------------+------------+
Entonces, incluso cuando especificamos WITH TIES
, ninguno está presente en este caso.
Ejemplo 5:uso de una cláusula WHERE
Aquí hay un último ejemplo, donde uso un WHERE
cláusula para extraer un montón de filas del medio de la tabla. El primer ejemplo es sin corbatas y el segundo con corbatas.
Sin ataduras:
SELECT TOP(4) AlbumId, AlbumName, ArtistId FROM Albums WHERE AlbumId > 10 ORDER BY ArtistId ASC;
Resultado:
+-----------+-------------------------+------------+ | AlbumId | AlbumName | ArtistId | |-----------+-------------------------+------------| | 19 | All Night Wrong | 3 | | 20 | The Sixteen Men of Tain | 3 | | 12 | Big Swing Face | 4 | | 16 | Long Lost Suitcase | 7 | +-----------+-------------------------+------------+
Con lazos:
SELECT TOP(4) WITH TIES AlbumId, AlbumName, ArtistId FROM Albums WHERE AlbumId > 10 ORDER BY ArtistId ASC;
Resultado:
+-----------+-------------------------+------------+ | AlbumId | AlbumName | ArtistId | |-----------+-------------------------+------------| | 19 | All Night Wrong | 3 | | 20 | The Sixteen Men of Tain | 3 | | 12 | Big Swing Face | 4 | | 16 | Long Lost Suitcase | 7 | | 17 | Praise and Blame | 7 | | 18 | Along Came Jones | 7 | +-----------+-------------------------+------------+