Как вы можете обнаружить родителя с вложенными отношениями в базе данных с помощью 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