Oracle: Paginating LISTAGG()



我正试图从数据库中提取一组引用的uuid,并使用LISTAGG()这样做,因此:

SELECT
COUNT(uuid) "Entries",
'( ' || LSITAGG( DISTINCT '''' || uuid || '''', ', ' ON OVERFLOW ERROR ) || ' )' "UUIDs"
FROM
table_with_uuids
/* 
WHERE
criteria omitted for brevity
*/
;

这工作得非常好,但是在一些用例中,呈现的uuid的数量会创建一个太长的字符串(因此使用ON OVERFLOW ERROR)。在这些情况下,我想迭代LISTAGG()的批次返回的结果。我觉得我在正确的轨道上这样做:

WITH active_uuids AS (
SELECT DISTINCT
uuid
FROM
table_with_uuids
-- [ WHERE clause omitted ]
OFFSET 0 ROWS FETCH NEXT 99 ROWS ONLY -- Fetching 100 will overflow LISTAGG
)
SELECT
count(uuid) "Entries",
'( ' || LISTAGG( '''' || uuid || '''', ', ' ON OVERFLOW ERROR ) || ' )' "UUIDs"
FROM
active_uuids
;

但是我不想手动增加OFFSET,直到我用完记录。理想情况下,我将能够在一次拍摄中获得所有返回记录的批量汇总列表。这可行吗?

(我访问这个数据库是有限的;我不能CREATE视图,临时表,函数,或任何有趣的东西的原因)。

使用GROUP BY CEIL(ROWNUM/99)设置paginate"将uid分成99行一组,然后聚合这些行。额外的"pages"将在下一组(s)中,因此您将获得多行:

WITH active_uuids (uuid) AS (
SELECT DISTINCT
uuid
FROM   table_with_uuids
ORDER BY uuid             -- Optional
)
SELECT count(uuid) AS Entries,
'( '
|| LISTAGG( '''' || uuid || '''', ', ' ) WITHIN GROUP (ORDER BY ROWNUM)
|| ' )' AS UUIDs
FROM   active_uuids
GROUP BY CEIL(ROWNUM/99);

小提琴

最新更新