sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo incluir resultados que empatan en el último lugar cuando se usa la cláusula TOP en SQL Server

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