Когато използвате TOP
клауза в заявка в SQL Server, може да срещнете случаи, при които два или повече резултата се свързват за последното място. Вероятно дори няма да знаете кога това се случва, тъй като поведението по подразбиране на TOP
е да върне не повече от посочения от вас брой редове.
TOP
клауза приема WITH TIES
аргумент, който ви позволява да укажете дали да включите или не всички резултати, които отговарят на последното място. Редовете могат да се изравнят за последното място поради техния ORDER BY
колона, съдържаща същата стойност. Следователно използването на този аргумент може да доведе до връщане на повече редове, отколкото сте посочили в действителност.
Пример 1 – Данните
Първо, ето данните, с които ще работим в следните примери:
ИЗБЕРЕТЕ AlbumId, AlbumName, ArtistId ОТ Албуми;
Резултат:
+-----------+------------------------------+------- -----+| ID на албума | Име на албум | ArtistId ||-----------+------------------------------+-------- ----|| 1 | Powerslave | 1 || 2 | Мощност | 2 || 3 | Пеене надолу по алеята | 6 || 4 | Зилтоид Всезнаещият | 5 || 5 | Жертвите на Cool | 5 || 6 | Epicloud | 5 || 7 | Някъде във времето | 1 || 8 | Част от ума | 1 || 9 | Убийци | 1 || 10 | Без молитва за умиращите | 1 || 11 | Няма звук без тишина | 9 || 12 | Big Swing Face | 4 || 13 | Синя нощ | 12 || 14 | Вечност | 12 || 15 | Скандинавия | 12 || 16 | Дълго изгубен куфар | 7 || 17 | Похвала и порицание | 7 || 18 | Along Came Jones | 7 || 19 | Цяла нощ грешно | 3 || 20 | Шестнадесетте мъже от Тейн | 3 || 21 | Yo Wassup | 9 || 22 | Скъсан | 9 |+-----------+--------------------------+-------- ----+
Пример 2 – Използвайте ТОП без връзки
Ето какво се случва, ако използваме TOP
без указване на WITH TIES
. Това е начинът, по който повечето хора използват тази клауза.
В този случай подреждам резултатите по ArtistId
.
ИЗБЕРЕТЕ TOP(3) AlbumId, AlbumName, ArtistId ОТ албуми ORDER BY ArtistId ASC;
Резултат:
+-----------+--------------------+-----------+| ID на албума | Име на албум | ArtistId ||-----------+------------------+------------|| 1 | Powerslave | 1 || 7 | Някъде във времето | 1 || 8 | Част от ума | 1 |+-----------+--------------------+-----------+предварително>Както се очакваше, получаваме три реда. Това са първите три, както е посочено от
TOP
клауза.Пример 3 – Използвайте TOP с връзки
Сега за вратовръзките. Ето какво се случва, ако добавим
WITH TIES
.ИЗБЕРЕТЕ ТОП(3) С ВРЪЗКИ AlbumId, AlbumName, ArtistId ОТ Албуми ORDER BY ArtistId ASC;Резултат:
+-----------+------------------------------+-------- ----+| ID на албума | Име на албум | ArtistId ||-----------+------------------------+--------- ---|| 1 | Powerslave | 1 || 7 | Някъде във времето | 1 || 8 | Част от ума | 1 || 9 | Убийци | 1 || 10 | Без молитва за умиращите | 1 |+-----------+------------------------------+-------- ---+Сега получаваме пет реда вместо само три. Това е така, защото има още два реда, които споделят същия
ArtistId
като трети ред. С други думи, три реда се връзваха за последното място.Имайте предвид, че в SQL Server върнатият ред на обвързване на редове е произволен.
Пример 4 – Променена клауза ORDER BY за премахване на връзки
Ако добавим
AlbumId
колона вORDER BY
клауза, това премахва изцяло връзките.ИЗБЕРЕТЕ ТОП(3) С ВРЪЗКИ AlbumId, AlbumName, ArtistId ОТ албуми ORDER BY ArtistId ASC, AlbumId ASC;Резултат:
+-----------+--------------------+-----------+| ID на албума | Име на албум | ArtistId ||-----------+------------------+------------|| 1 | Powerslave | 1 || 7 | Някъде във времето | 1 || 8 | Част от ума | 1 |+-----------+--------------------+-----------+предварително>Така че дори когато посочим
WITH TIES
, в този случай няма такива.Пример 5 – Използване на клауза WHERE
Ето един последен пример, където използвам
WHERE
клауза за извличане на куп редове от средата на таблицата. Първият пример е без връзки, а вторият е с връзки.Без връзки:
ИЗБЕРЕТЕ TOP(4) AlbumId, AlbumName, ArtistId FROM AlbumsWHERE AlbumId> 10 ORDER BY ArtistId ASC;Резултат:
+-----------+------------------------------+-------- ----+| ID на албума | Име на албум | ArtistId ||-----------+------------------------+--------- ---|| 19 | Цяла нощ грешно | 3 || 20 | Шестнадесетте мъже от Тейн | 3 || 12 | Big Swing Face | 4 || 16 | Дълго изгубен куфар | 7 |+-----------+------------------------------+-------- ---+С връзки:
ИЗБЕРЕТЕ ТОП(4) С ВРЪЗКИ AlbumId, AlbumName, ArtistId ОТ Албуми WHERE AlbumId> 10 ORDER BY ArtistId ASC;Резултат:
+-----------+------------------------------+-------- ----+| ID на албума | Име на албум | ArtistId ||-----------+------------------------+--------- ---|| 19 | Цяла нощ грешно | 3 || 20 | Шестнадесетте мъже от Тейн | 3 || 12 | Big Swing Face | 4 || 16 | Дълго изгубен куфар | 7 || 17 | Похвала и порицание | 7 || 18 | Along Came Jones | 7 |+-----------+------------------------------+-------- ---+