Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak uwzględnić wyniki związane z ostatnim miejscem podczas używania klauzuli TOP w SQL Server?

Podczas korzystania z TOP klauzuli w zapytaniu w SQL Server, możesz napotkać sytuacje, w których dwa lub więcej wyników zajmuje ostatnie miejsce. Prawdopodobnie nawet nie wiedziałbyś, kiedy to się stanie, ponieważ domyślne zachowanie TOP ma zwrócić nie więcej niż określoną liczbę wierszy.

TOP klauzula akceptuje WITH TIES argument, który pozwala określić, czy uwzględnić wszystkie wyniki związane z ostatnim miejscem. Rzędy mogą remisować na ostatnim miejscu ze względu na ich ORDER BY kolumna zawierająca tę samą wartość. Użycie tego argumentu może zatem spowodować zwrócenie większej liczby wierszy niż faktycznie określono.

Przykład 1 – Dane

Po pierwsze, oto dane, z którymi będziemy pracować w następujących przykładach:

SELECT 
  AlbumId,
  AlbumName,
  ArtistId 
FROM Albums;

Wynik:

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

Przykład 2 – Użyj TOP bez krawatów

Oto, co się stanie, jeśli użyjemy TOP bez określenie WITH TIES . W ten sposób większość ludzi używa tej klauzuli.

W tym przypadku sortuję wyniki według ArtistId .

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

Wynik:

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

Zgodnie z oczekiwaniami otrzymujemy trzy rzędy. To są trzy najlepsze, jak określono w TOP klauzula.

Przykład 3 – Użyj TOP z krawatami

Teraz krawaty. Oto, co się stanie, jeśli dodamy WITH TIES .

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

Wynik:

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

Teraz otrzymujemy pięć rzędów zamiast tylko trzech. Dzieje się tak, ponieważ są jeszcze dwa wiersze, które mają ten sam ArtistId jako trzeci rząd. Innymi słowy, o ostatnie miejsce remisowały trzy rzędy.

Należy zauważyć, że w SQL Server zwrócona kolejność wierszy wiązania jest dowolna.

Przykład 4 – Zmodyfikowana klauzula ORDER BY w celu wyeliminowania powiązań

Jeśli dodamy AlbumId kolumnę do ORDER BY klauzuli, to całkowicie eliminuje więzi.

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

Wynik:

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

Więc nawet jeśli określimy WITH TIES , żadne nie występują w tym przypadku.

Przykład 5 – Użycie klauzuli WHERE

Oto ostatni przykład, w którym używam WHERE klauzula, aby wyodrębnić kilka wierszy ze środka tabeli. Pierwszy przykład jest bez remisów, a drugi z remisami.

Bez krawatów:

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

Wynik:

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

Z krawatami:

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

Wynik:

+-----------+-------------------------+------------+
| 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL INSERT INTO z wielu tabel

  2. Jakie są zalety i wady przechowywania SQL w Stored Procs w porównaniu z kodem?

  3. Efektywnie konwertuj wiersze na kolumny w serwerze sql

  4. Nazwa tabeli jako zmienna

  5. Utwórz widok powiązania schematu w SQL Server