У меня есть таблица документов с рекурсивной древовидной структурой, использующей собственные ссылки.
Table Docs
------------
id
parentId -- parent Docs' id
name
isFile -- is this entry a file?
...
, где корневая папка имеет parentId = null
.
Теперь я хотел бы создать SQL-запрос, который рекурсивно выбирает документы, где совпадает имя (%.ending1
, %.ending2
)
Мои попытки привели меня к этому:
WITH RECURSIVE DocsRecursive AS (
SELECT "id", "parentId", "name"
FROM "Docs"
WHERE id = <seed-id>
UNION ALL
SELECT child."id", child."parentId", child."name"
FROM "Docs" AS child
JOIN DocsRecursive AS parent ON parent.id = child."parentId" AND
(
child."name" LIKE '%.ending1' OR
child."name" LIKE '%.ending2'
)
)
SELECT * FROM DocsRecursive
Проблема в том, что он возвращает прямые дочерние документы только в том случае, если имя соответствует предполагаемым окончаниям.Потому что, если прямые потомки не совпадают с именами (поскольку они не совпадают, так как они являются папками), они не просматриваются дальше.
Возможно ли пройти по всему дереву, но вернуть документы только там, гдеимя соответствует моему окончанию?