Как вы можете обнаружить родителя с вложенными отношениями в базе данных, используя SQL?
Я использую Firebird 2.1. Есть имя таблицы Folders
с полями:
- FolderID
- ParentFolderID
- Имя папки
ParentFolderID
равно -1, если это корневая папка - в противном случае она содержит идентификатор родительской папки.
Как мне найти всех родителей (вплоть до корневой папки) узла низкого уровня?
Нужен ли мне рекурсивный запрос? ( Firebird поддерживает их)
1 ответ
Решение
Что-то вроде этого:
WITH RECURSIVE hierarchy (folderid, ParentFolderId, FolderName) as (
SELECT folderid, ParentFolderId, FolderName
FROM folders
WHERE ParentFolderID = -1
UNION ALL
SELECT folderid, ParentFolderId, FolderName
FROM folders f
JOIN hierarchy p ON p.folderID = f.parentFolderID
)
SELECT *
FROM hierarchy
Изменить: следующий запрос будет проходить иерархию "вверх", находя всех родителей данной папки.
WITH RECURSIVE hierarchy (folderid, ParentFolderId, FolderName) as (
SELECT folderid, ParentFolderId, FolderName
FROM folders
WHERE folderid = 42
UNION ALL
SELECT folderid, ParentFolderId, FolderName
FROM folders f
JOIN hierarchy p ON p.parentFolderID = f.folderID
)
SELECT *
FROM hierarchy