sql >> Databáze >  >> RDS >> Sqlserver

Jak zahrnout výsledky s nerozhodným výsledkem na posledním místě při použití klauzule TOP na serveru SQL Server

Při použití TOP klauzule v dotazu na serveru SQL Server, můžete narazit na případy, kdy se dva nebo více výsledků shoduje na posledním místě. Pravděpodobně byste ani nevěděli, kdy se to stane, protože výchozí chování TOP je vrátit ne více než počet řádků, které určíte.

TOP klauzule přijímá WITH TIES argument, který vám umožňuje určit, zda mají být zahrnuty všechny výsledky, které se shodují na posledním místě. Řádky mohou být na posledním místě nerozhodné díky ORDER BY sloupec obsahující stejnou hodnotu. Použití tohoto argumentu proto může vést k tomu, že se vrátí více řádků, než jste ve skutečnosti zadali.

Příklad 1 – Data

Za prvé, zde jsou data, se kterými budeme pracovat v následujících příkladech:

VYBERTE AlbumId, AlbumName, ArtistId FROM Albums;

Výsledek:

+-----------+--------------------------+------- -----+| AlbumId | Název alba | ArtistId ||-----------+--------------------------+-------- ----|| 1 | Powerslave | 1 || 2 | Výkon | 2 || 3 | Singing Down the Lane | 6 || 4 | Ziltoid vševěd | 5 || 5 | Oběti Cool | 5 || 6 | Epicloud | 5 || 7 | Někde v čase | 1 || 8 | Kousek mysli | 1 || 9 | Zabijáci | 1 || 10 | Žádná modlitba za umírající | 1 || 11 | Žádný zvuk bez ticha | 9 || 12 | Big Swing Face | 4 || 13 | Modrá noc | 12 || 14 | Věčnost | 12 || 15 | Skandinávie | 12 || 16 | Dlouho ztracený kufr | 7 || 17 | Chvála a vina | 7 || 18 | Along Came Jones | 7 || 19 | Celá noc špatně | 3 || 20 | Šestnáct mužů z Tainu | 3 || 21 | Yo Wassup | 9 || 22 | Zatčen | 9 |+-----------+--------------------------+--------- ----+

Příklad 2 – Použijte TOP bez kravat

Zde je to, co se stane, když použijeme TOP bez specifikující WITH TIES . Toto je způsob, jakým většina lidí používá tuto klauzuli.

V tomto případě seřadím výsledky podle ArtistId .

VYBERTE NEJLEPŠÍ (3) ID alba, název alba, ID interpreta Z OBJEDNÁVEK alb PODLE ArtistId ASC;

Výsledek:

+-----------+-------------------+------------+| AlbumId | Název alba | ArtistId ||-----------+-------------------+------------|| 1 | Powerslave | 1 || 7 | Někde v čase | 1 || 8 | Kousek mysli | 1 |+-----------+-------------------+------------+ 

Podle očekávání dostáváme tři řady. Toto jsou první tři, jak je uvedeno v TOP doložka.

Příklad 3 – Použijte TOP With Ties

Nyní k kravatám. Co se stane, když přidáme WITH TIES .

VYBERTE NEJLEPŠÍ (3) S VAZBAMI AlbumId, AlbumName, ArtistId FROM AlbumsORDER BY ArtistId ASC;

Výsledek:

+-----------+-------------------------+-------- ----+| AlbumId | Název alba | ArtistId ||-----------+-------------------------+--------- ---|| 1 | Powerslave | 1 || 7 | Někde v čase | 1 || 8 | Kousek mysli | 1 || 9 | Zabijáci | 1 || 10 | Žádná modlitba za umírající | 1 |+-----------+-------------------------+--------- ---+

Nyní dostáváme pět řádků místo pouhých tří. Důvodem je, že existují dva další řádky, které sdílejí stejné ArtistId jako třetí řada. Jinými slovy, o poslední místo se dělily tři řady.

Všimněte si, že v SQL Server je vrácené pořadí vázání řádků libovolné.

Příklad 4 – Upravená klauzule ORDER BY k odstranění remíz

Pokud přidáme AlbumId do sloupce ORDER BY klauzule, tím se vazby úplně eliminují.

VYBERTE NEJLEPŠÍ (3) S VAZBAMI AlbumId, AlbumName, ArtistId FROM AlbumsORDER BY ArtistId ASC, AlbumId ASC;

Výsledek:

+-----------+-------------------+------------+| AlbumId | Název alba | ArtistId ||-----------+-------------------+------------|| 1 | Powerslave | 1 || 7 | Někde v čase | 1 || 8 | Kousek mysli | 1 |+-----------+-------------------+------------+ 

Tedy i když zadáme WITH TIES , v tomto případě nejsou přítomny žádné.

Příklad 5 – Použití klauzule WHERE

Zde je jeden poslední příklad, kde používám WHERE klauzule k extrahování hromady řádků ze středu tabulky. První příklad je bez kravat a druhý je s kravatami.

Bez vazeb:

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

Výsledek:

+-----------+-------------------------+-------- ----+| AlbumId | Název alba | ArtistId ||-----------+-------------------------+--------- ---|| 19 | Celá noc špatně | 3 || 20 | Šestnáct mužů z Tainu | 3 || 12 | Big Swing Face | 4 || 16 | Dlouho ztracený kufr | 7 |+-----------+-------------------------+---------- ---+

S kravatami:

VYBERTE NEJLEPŠÍ (4) S TIEŽMI AlbumId, AlbumName, ArtistId FROM AlbumsWHERE AlbumId> 10ORDER BY ArtistId ASC;

Výsledek:

+-----------+-------------------------+-------- ----+| AlbumId | Název alba | ArtistId ||-----------+-------------------------+--------- ---|| 19 | Celá noc špatně | 3 || 20 | Šestnáct mužů z Tainu | 3 || 12 | Big Swing Face | 4 || 16 | Dlouho ztracený kufr | 7 || 17 | Chvála a vina | 7 || 18 | Along Came Jones | 7 |+-----------+-------------------------+---------- ---+

  1. Jak zakázat všechna omezení CHECK a cizích klíčů v databázi na serveru SQL (příklady T-SQL)

  2. Asynchronní úlohy s Django a celerem

  3. Mohu zapnout ignore_dup_key pro primární klíč?

  4. Jak připojit programy C++ k MariaDB