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