Evet. Basit bir pencere işlevi ile:
SELECT *, count(*) OVER() AS full_count
FROM tbl
WHERE
ORDER BY col1
OFFSET ?
LIMIT ?
Maliyetin toplam sayı olmadan önemli ölçüde daha yüksek olacağını, ancak yine de tipik olarak iki ayrı sorudan daha ucuz olacağını unutmayın. Postgres her iki şekilde de tüm satırları saymak zorundadır , bu da uygun satırların toplam sayısına bağlı olarak bir maliyet getirir. Detaylar:
Bununla birlikte , Dani'nin belirttiği gibiOFFSET
, en azından temel sorgudan döndürülen satır sayısı kadar büyük olduğunda , hiçbir satır döndürülmez. Yani biz de anlamıyoruz full_count
.
Bu kabul edilebilir değilse, her zaman tam sayımı döndürmek için olası bir geçici çözüm bir CTE ve bir OUTER JOIN
:
WITH cte AS (
SELECT *
FROM tbl
WHERE
)
SELECT *
FROM (
TABLE cte
ORDER BY col1
LIMIT ?
OFFSET ?
) sub
RIGHT JOIN (SELECT count(*) FROM cte) c(full_count) ON true;
Çok büyükse full_count
eklenen bir NULL değer satırı alırsınız OFFSET
. Aksi takdirde, ilk sorguda olduğu gibi her satıra eklenir.
Tüm NULL değerlere sahip bir satır olası geçerli bir offset >= full_count
sonuçsa, boş satırın başlangıç noktasını kontrol etmeniz gerekir .
Bu yine de temel sorguyu yalnızca bir kez yürütür. Ancak sorguya daha fazla ek yük ekler ve yalnızca sayı için temel sorguyu tekrar etmekten daha azsa ödeme yapar.
Son sıralama düzenini destekleyen dizinler mevcutsa, ORDER BY
CTE'ye (fazlalık olarak) dahil etmek faydalı olabilir .