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