Я тут мудрил, химичил, деже небольшой 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 написать чтобы быстрее было?

Ответить