我正试图从数据库中提取一组引用的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);
小提琴