Postgresql

您可以通過 1 個查詢並行分頁 2 個表嗎

  • January 30, 2022

我想通過 2 個不同的來源進行分頁。我想我可以使用將 2 個查詢合併為一個的方法來做到這一點,但是,我不想並行合併它們。

是否可以選擇第一個查詢的大小,所以我可以限制第二個查詢的大小;允許我正確分頁;首先通過第一個查詢;如果部分/沒有結果;然後通過第二個查詢分頁。

我顯然可以在我的應用程序級別實現這一點,但我更喜歡單個查詢。


想了想,或許我可以做這樣的事情?

with a as (... offset :offset limit :limit), 
   a_count as (select count(*) from a)
   select * a 
   union
   select ...
   offset (select count from a_count)
   limit greatest(:limit - (select count from a_count), 0)

這有效率嗎?我可以改進什麼?

簡單地:

SELECT 'a' AS source, * FROM a
UNION ALL                         -- NOT just UNION!!
SELECT 'b' AS source, * FROM b    -- matching row type!
OFFSET :offset
LIMIT  :limit;

添加source是可選的。

除非使用括號,否則LIMIT/OFFSET適用於組合結果集。結合UNION ALL, 並且沒有 outer ORDER BY,您a首先從表中獲取行,然後從表中獲取行b

如果您需要特定的排序順序,請ORDER BY使用括號添加每個表。像:

(SELECT * FROM a ORDER BY foo)
UNION ALL
(SELECT * FROM b ORDER BY bar)
OFFSET :offset
LIMIT  :limit;

還是沒有外掛ORDER BY

但是LIMIT/OFFEST用於分頁的比例對於大表來說非常糟糕。改為考慮:

引用自:https://dba.stackexchange.com/questions/306764