sql >> Database >  >> RDS >> Sqlserver

Resultaten opnemen die gelijk zijn voor de laatste plaats bij gebruik van de TOP-clausule in SQL Server

Bij gebruik van de TOP clausule in een query in SQL Server, kan het voorkomen dat twee of meer resultaten op de laatste plaats eindigen. Je zou waarschijnlijk niet eens weten wanneer dit gebeurt, omdat het standaardgedrag van TOP is om niet meer terug te geven dan het aantal rijen dat u opgeeft.

De TOP clausule accepteert een WITH TIES argument waarmee u kunt specificeren of u al dan niet alle resultaten wilt opnemen die gelijk zijn aan de laatste plaats. Rijen kunnen gelijk eindigen voor de laatste plaats vanwege hun ORDER BY kolom met dezelfde waarde. Het gebruik van dit argument kan er daarom toe leiden dat er meer rijen worden geretourneerd dan u daadwerkelijk hebt opgegeven.

Voorbeeld 1 – De gegevens

Ten eerste, hier zijn de gegevens waarmee we zullen werken in de volgende voorbeelden:

SELECT 
  AlbumId,
  AlbumName,
  ArtistId 
FROM Albums;

Resultaat:

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

Voorbeeld 2 – Gebruik TOP zonder banden

Dit is wat er gebeurt als we TOP gebruiken zonder specificeren van WITH TIES . Dit is de manier waarop de meeste mensen deze clausule gebruiken.

In dit geval bestel ik de resultaten op ArtistId .

SELECT TOP(3)
  AlbumId,
  AlbumName,
  ArtistId 
FROM Albums
ORDER BY ArtistId ASC;

Resultaat:

+-----------+-------------------+------------+
| AlbumId   | AlbumName         | ArtistId   |
|-----------+-------------------+------------|
| 1         | Powerslave        | 1          |
| 7         | Somewhere in Time | 1          |
| 8         | Piece of Mind     | 1          |
+-----------+-------------------+------------+

Zoals verwacht krijgen we drie rijen. Dit is de top drie zoals gespecificeerd door de TOP clausule.

Voorbeeld 3 – Gebruik TOP met stropdassen

Nu voor de banden. Dit is wat er gebeurt als we WITH TIES toevoegen .

SELECT TOP(3) WITH TIES
  AlbumId,
  AlbumName,
  ArtistId 
FROM Albums
ORDER BY ArtistId ASC;

Resultaat:

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

We krijgen nu vijf rijen in plaats van slechts drie. Dit komt omdat er nog twee rijen zijn die dezelfde ArtistId . delen als de derde rij. Met andere woorden, drie rijen gingen gelijk op voor de laatste plaats.

Houd er rekening mee dat in SQL Server de geretourneerde volgorde van het binden van rijen willekeurig is.

Voorbeeld 4 – Een gewijzigde ORDER BY-clausule om banden te elimineren

Als we de AlbumId . toevoegen kolom naar de ORDER BY clausule, dit elimineert de banden helemaal.

SELECT TOP(3) WITH TIES
  AlbumId,
  AlbumName,
  ArtistId 
FROM Albums
ORDER BY ArtistId ASC, AlbumId ASC;

Resultaat:

+-----------+-------------------+------------+
| AlbumId   | AlbumName         | ArtistId   |
|-----------+-------------------+------------|
| 1         | Powerslave        | 1          |
| 7         | Somewhere in Time | 1          |
| 8         | Piece of Mind     | 1          |
+-----------+-------------------+------------+

Dus zelfs als we WITH TIES specify specificeren , in dit geval zijn er geen aanwezig.

Voorbeeld 5 – Een WHERE-clausule gebruiken

Hier is nog een laatste voorbeeld, waarbij ik een WHERE . gebruik clausule om een ​​aantal rijen uit het midden van de tabel te extraheren. Het eerste voorbeeld is zonder stropdassen en het tweede is met stropdassen.

Zonder stropdassen:

SELECT TOP(4)
  AlbumId,
  AlbumName,
  ArtistId 
FROM Albums
WHERE AlbumId > 10
ORDER BY ArtistId ASC;

Resultaat:

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

Met stropdassen:

SELECT TOP(4) WITH TIES
  AlbumId,
  AlbumName,
  ArtistId 
FROM Albums
WHERE AlbumId > 10
ORDER BY ArtistId ASC;

Resultaat:

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

  1. Werken met hulpmiddelen op het scherm in Access 2019

  2. strtotime gebruiken voor datums vóór 1970

  3. Hekaton met een twist:In-memory TVP's – Deel 1

  4. Zoek uit of een object een door de gebruiker gedefinieerde tabel in SQL Server is met OBJECTPROPERTY()