Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да включите резултати, които се равняват на последното място, когато използвате клаузата TOP в SQL Server

Когато използвате 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 |+-----------+------------------------------+-------- ---+

  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 Server

  2. 6 начина да проверите дали таблица съществува в SQL Server (примери за T-SQL)

  3. Вложен оператор за избор в SQL Server

  4. Как да деактивирате ограничение CHECK в SQL Server (примери за T-SQL)

  5. SQL Server еквивалентен на MySQL enum тип данни?