Я тут мудрил, химичил, деже небольшой Featuire request в трекер написал,
но тем не меннее нормального пути так и не нашёл.
Задача простая - ограничить "глубину" возвращаемого дерева.
Если написать так:
WITH RECURSIVE TR AS (
SELECT T.*, 1 AS LEV FROM "Tree" T WHERE PARENT_ID IS NULL
UNION ALL
SELECT T.*, TR.LEV + 1 AS LEV FROM "Tree" T, TR WHERE PARENT_ID = TR.ID)
SELECT ID, LEV FROM TR WHERE LEV <= 1
То совсем кака получается, т.к. сервер все дерево строит, а потом фильтрует.
Если написать так:
WITH RECURSIVE TR AS (
SELECT T.*, 1 AS LEV FROM "Tree" T WHERE PARENT_ID IS NULL
UNION ALL
SELECT T.*, TR.LEV + 1 AS LEV FROM "Tree" T, TR WHERE PARENT_ID =
TR.ID AND TR.LEV < 1)
SELECT ID, LEV FROM TR
то получается меньшая, но всё ещё кака, т.к. на листьях много лишних
движений (у меня например в простейшем примере на 3 результирующих
записи сервер проситал аж 7). Об этом я в трекер написал:
http://tracker.firebirdsql.org/browse/CORE-1287
Может у кого есть идея как ещё такой CTE написать чтобы быстрее было?