PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostgreSQL 13:BATAS ... DENGAN DIKAT

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!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa yang menyebabkan More tidak dikenali... kesalahan saat menjalankan Postgresql 11 pada mesin Windows?

  2. Sekarang() tanpa zona waktu

  3. Tips Penerapan Hybrid Cloud PostgreSQL

  4. Mengapa PostgreSQL tidak menyukai nama tabel UPPERCASE?

  5. Menyiapkan Django dan PostgreSQL pada dua instans EC2 yang berbeda