Saat menggunakan TOP
klausa dalam kueri di SQL Server, Anda mungkin menemukan kesempatan di mana dua atau lebih hasil mengikat untuk tempat terakhir. Anda mungkin bahkan tidak akan tahu kapan ini terjadi, karena perilaku default TOP
adalah mengembalikan tidak lebih dari jumlah baris yang Anda tentukan.
TOP
klausa menerima WITH TIES
argumen yang memungkinkan Anda menentukan apakah akan menyertakan semua hasil yang mengikat untuk tempat terakhir atau tidak. Baris dapat mengikat untuk tempat terakhir karena ORDER BY
their kolom yang berisi nilai yang sama. Oleh karena itu, menggunakan argumen ini dapat menghasilkan lebih banyak baris yang dikembalikan daripada yang sebenarnya Anda tentukan.
Contoh 1 – Data
Pertama, inilah data yang akan kita kerjakan dalam contoh berikut:
PILIH AlbumId, AlbumName, ArtistId FROM Albums;
Hasil:
+-----------+--------------------------+------- -----+| Id Album | Nama Album | ArtistId ||-----------+--------------------------+-------- ----|| 1 | budak kekuasaan | 1 || 2 | Daya | 2 || 3 | Bernyanyi di Jalan | 6 || 4 | Ziltoid Yang Mahatahu | 5 || 5 | Korban Keren | 5 || 6 | Epicloud | 5 || 7 | Di suatu tempat dalam Waktu | 1 || 8 | Sepotong Pikiran | 1 || 9 | Pembunuh | 1 || 10 | Tidak Ada Doa untuk Kematian | 1 || 11 | Tidak Ada Suara Tanpa Keheningan | 9 || 12 | Wajah Ayunan Besar | 4 || 13 | Malam Biru | 12 || 14 | Keabadian | 12 || 15 | Skandinavia | 12 || 16 | Koper Lama Hilang | 7 || 17 | Memuji dan Menyalahkan | 7 || 18 | Seiring Datanglah Jones | 7 || 19 | Semua Malam Salah | 3 || 20 | Enam Belas Pria Tain | 3 || 21 | Yo Wassup | 9 || 22 | rusak | 9 |+-----------+--------------------------+-------- ----+
Contoh 2 – Gunakan TOP Tanpa Ikatan
Inilah yang terjadi jika kita menggunakan TOP
tanpa menentukan WITH TIES
. Ini adalah cara kebanyakan orang menggunakan klausa ini.
Dalam hal ini, saya mengurutkan hasil dengan ArtistId
.
SELECT TOP(3) AlbumId, AlbumName, ArtistId FROM AlbumsORDER BY ArtistId ASC;
Hasil:
+-----------+-------------------+------------+| Id Album | Nama Album | ArtistId ||-----------+-------------------+------------|| 1 | budak kekuasaan | 1 || 7 | Di suatu tempat dalam Waktu | 1 || 8 | Sepotong Pikiran | 1 |+-----------+-------------------+------------+Seperti yang diharapkan, kami mendapatkan tiga baris. Ini adalah tiga teratas seperti yang ditentukan oleh
TOP
klausa.Contoh 3 – Gunakan TOP Dengan Ties
Sekarang untuk ikatan. Inilah yang terjadi jika kita menambahkan
WITH TIES
.PILIH TOP(3) DENGAN Ikatan AlbumId, AlbumName, ArtistId FROM AlbumsORDER BY ArtistId ASC;Hasil:
+-----------+--------------+-------- ----+| Id Album | Nama Album | ArtistId ||-----------+--------------+--------- ---|| 1 | budak kekuasaan | 1 || 7 | Di suatu tempat dalam Waktu | 1 || 8 | Sepotong Pikiran | 1 || 9 | Pembunuh | 1 || 10 | Tidak Ada Doa untuk Kematian | 1 |+-----------+--------------+--------- ---+Kami sekarang mendapatkan lima baris, bukan hanya tiga. Ini karena ada dua baris lagi yang memiliki
ArtistId
yang sama sebagai baris ketiga. Dengan kata lain, tiga baris mengikat untuk tempat terakhir.Perhatikan bahwa di SQL Server, urutan kembali dari mengikat baris adalah arbitrer.
Contoh 4 – Klausa ORDER BY yang Dimodifikasi untuk Menghilangkan Ikatan
Jika kita menambahkan
AlbumId
kolom keORDER BY
klausa, ini menghilangkan ikatan sama sekali.SELECT TOP(3) WITH TIES AlbumId, AlbumName, ArtistId FROM AlbumsORDER BY ArtistId ASC, AlbumId ASC;Hasil:
+-----------+-------------------+------------+| Id Album | Nama Album | ArtistId ||-----------+-------------------+------------|| 1 | budak kekuasaan | 1 || 7 | Di suatu tempat dalam Waktu | 1 || 8 | Sepotong Pikiran | 1 |+-----------+-------------------+------------+Jadi meskipun kita menentukan
WITH TIES
, tidak ada yang hadir dalam kasus ini.Contoh 5 – Menggunakan Klausa WHERE
Berikut ini satu contoh terakhir, di mana saya menggunakan
WHERE
klausa untuk mengekstrak sekelompok baris dari tengah tabel. Contoh pertama adalah tanpa ikatan, dan yang kedua dengan ikatan.Tanpa ikatan:
PILIH TOP(4) AlbumId, AlbumName, ArtistId FROM AlbumsWHERE AlbumId> 10ORDER BY ArtistId ASC;Hasil:
+-----------+--------------+-------- ----+| Id Album | Nama Album | ArtistId ||-----------+--------------+--------- ---|| 19 | Semua Malam Salah | 3 || 20 | Enam Belas Pria Tain | 3 || 12 | Wajah Ayunan Besar | 4 || 16 | Koper Lama Hilang | 7 |+-----------+--------------+--------- ---+Dengan ikatan:
PILIH TOP(4) DENGAN Ikatan AlbumId, AlbumName, ArtistId FROM AlbumsWHERE AlbumId> 10ORDER BY ArtistId ASC;Hasil:
+-----------+--------------+-------- ----+| Id Album | Nama Album | ArtistId ||-----------+--------------+--------- ---|| 19 | Semua Malam Salah | 3 || 20 | Enam Belas Pria Tain | 3 || 12 | Wajah Ayunan Besar | 4 || 16 | Koper Lama Hilang | 7 || 17 | Memuji dan Menyalahkan | 7 || 18 | Seiring Datanglah Jones | 7 |+-----------+--------------+--------- ---+