Как вы можете обнаружить родителя с вложенными отношениями в базе данных, используя SQL? - PullRequest
6 голосов
/ 05 июля 2011

Я использую Firebird 2.1.Существует имя таблицы Folders с полями:

  • FolderID
  • ParentFolderID
  • FolderName

ParentFolderID is-1, если это корневая папка - в противном случае она содержит идентификатор родительской папки.

Как найти всех родителей (вплоть до корневой папки) узла низкого уровня?

Должен ли янужен рекурсивный запрос?( Firebird поддерживает их )

1 Ответ

8 голосов
/ 05 июля 2011

Примерно так:

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
...