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

Jalankan kueri dengan LIMIT/OFFSET dan dapatkan juga jumlah total baris

Ya. Dengan fungsi jendela sederhana:

SELECT *, count(*) OVER() AS full_count
FROM   tbl
WHERE  /* whatever */
ORDER  BY col1
OFFSET ?
LIMIT  ?

Ketahuilah bahwa biayanya akan jauh lebih tinggi daripada tanpa jumlah total, tetapi biasanya masih lebih murah daripada dua kueri terpisah. Postgres harus benar-benar menghitung semua baris cara mana pun, yang membebankan biaya tergantung pada jumlah total baris yang memenuhi syarat. Detail:

  • Cara terbaik untuk mendapatkan jumlah hasil sebelum LIMIT diterapkan

Namun , seperti yang ditunjukkan Dani, ketika OFFSET setidaknya sama besarnya dengan jumlah baris yang dikembalikan dari kueri dasar, tidak ada baris yang dikembalikan. Jadi kami juga tidak mendapatkan full_count .

Jika itu tidak dapat diterima, kemungkinan solusi untuk selalu mengembalikan jumlah penuh akan dengan CTE dan OUTER JOIN :

WITH cte AS (
   SELECT *
   FROM   tbl
   WHERE  /* whatever */
   )
SELECT *
FROM  (
   TABLE  cte
   ORDER  BY col1
   LIMIT  ?
   OFFSET ?
   ) sub
RIGHT  JOIN (SELECT count(*) FROM cte) c(full_count) ON true;

Anda mendapatkan satu baris nilai NULL dengan full_count ditambahkan jika OFFSET terlalu besar. Jika tidak, itu ditambahkan ke setiap baris seperti pada kueri pertama.

Jika baris dengan semua nilai NULL adalah kemungkinan hasil yang valid, Anda harus memeriksa offset >= full_count untuk membedakan asal baris kosong.

Ini masih mengeksekusi kueri dasar hanya sekali. Tapi itu menambahkan lebih banyak overhead ke kueri dan hanya membayar jika itu kurang dari mengulangi kueri dasar untuk penghitungan.

Jika indeks yang mendukung urutan pengurutan akhir tersedia, mungkin perlu menyertakan ORDER BY di CTE (secara berlebihan).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres:Bagaimana cara melakukan kunci Komposit?

  2. Tips Dan Trik Postgres

  3. Menyiapkan kunci asing dengan tipe data yang berbeda

  4. Kontrol Versi PostgreSQL dengan Atlassian Bitbucket

  5. Memilih beberapa nilai max() menggunakan satu pernyataan SQL