Salah satu fitur baru di PostgreSQL 13 adalah standar SQL WITH TIES
klausa untuk digunakan dengan LIMIT
— atau, sebagai panggilan standar, FETCH FIRST n ROWS
. Terima kasih kepada Surafel Temesgen sebagai penulis patch awal; Tomas Vondra dan milik Anda benar-benar untuk beberapa perbaikan kode tambahan; dan pengulas Andrew Gierth dan Erik Rijkers. Anda dapat membaca dengan teliti pesan komit.
Ikatan sangat sering terjadi saat memberi peringkat; misalnya, dalam perlombaan kaukus Anda dapat memiliki banyak ikatan, dan tentu saja Anda tidak ingin menghilangkan hadiah dari peserta! Apa WITH TIES
tidak cukup sederhana:ia menambahkan baris atau baris berikut ke set hasil Anda, jika peringkatnya sama dengan baris terakhir yang dikembalikan per LIMIT
klausa, sesuai dengan ORDER BY
klausa.
Jika Anda hanya menginginkan dua karyawan dengan gaji tertinggi, Anda dapat melakukan ini:
SELECT * FROM employees ORDER BY salary DESC LIMIT 2;
nama | gaji | departemen |
---|---|---|
Alicia | 1600 | teknik |
Oruga | 1500 | pemasaran |
Jadi apakah Anda gatal untuk mengetahui gaji orang berikutnya? Bagaimana jika dia cocok dengan Oruga, dan ditinggalkan begitu saja karena kebetulan atau nasib buruk? Itu bisa terjadi, seperti yang Anda ketahui; dan untungnya, WITH TIES
sekarang ada untuk menyelamatkan hari. (Perhatikan bahwa, pada kenyataannya, kami tidak menangani WITH TIES
di LIMIT
klausa seperti itu. Anda harus menggunakan FETCH FIRST
sintaks, yang merupakan standar yang diamanatkan, agar dapat menggunakan WITH TIES
.)
SELECT * FROM employees ORDER BY salary DESC FETCH FIRST 2 ROWS WITH TIES;
nama | gaji | departemen |
---|---|---|
Alicia | 1600 | teknik |
Oruga | 1500 | penjualan |
Conejo Blanco | 1500 | pemasaran |
Di sana! Kelinci Putih punya untuk terdaftar, dan sekarang dia.
Beberapa catatan sebelum Anda menjadi terlalu gila. LIMIT
(atau lebih tepatnya FETCH FIRST
) tidak lagi menjanjikan untuk mengembalikan persis jumlah baris yang Anda tentukan. Anda bisa mendapatkan dua atau dua puluh baris tambahan, atau 100x baris sebanyak yang Anda minta. Antara lain ini berarti Anda perlu melacak berapa banyak baris yang telah Anda lihat sejauh ini, jika Anda membuat paginasi hasil. Di atas, Anda mendapat tiga baris, jadi untuk halaman berikutnya Anda melewatkan sebanyak itu dengan menambahkan OFFSET
yang tepat klausa:
SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES
OFFSET 3;
nama | gaji | departemen |
---|---|---|
Falsa Tortuga | 1400 | pemasaran |
Duquesa | 1300 | penjualan |
Liebre de Marzo | 1300 | teknik |
Kami kembali mendapat tiga daripada hanya dua yang kami minta. Jadi untuk halaman berikutnya Anda harus melewati enam. Dan seterusnya. Pastikan memiliki bidal yang cukup untuk semua orang.
Hal lain yang perlu diingat adalah Anda harus memastikan hanya menggunakan ORDER BY
klausa yang sesuai dengan WITH TIES
ayat; jika Anda ingin, katakanlah, memiliki baris gaji yang sama yang diurutkan berdasarkan nama, Anda harus menggunakan subquery. Jika tidak, perbedaan nama akan menyelesaikan ikatan gaji, sehingga baris berikutnya tidak akan disertakan. Misalnya:
SELECT * FROM (
SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES) AS subq
ORDER BY salary DESC, name;
Fitur ini ada untuk membantu Anda menampilkan semua baris dengan nilai yang sama — fitur ini memungkinkan Anda tidak membedakan beberapa baris dengan nilai yang sama hanya berdasarkan lokasi fisik di dalam tabel.
Selamat paginasi!