我正在使用Firebird 2.1。表名为Folders,包含以下字段:
FolderID
ParentFolderID
FolderName
如果是根文件夹,则ParentFolderID为-1 - 否则它包含父文件夹的ID。
以下递归查询将按顺序返回文件夹的父项:
WITH RECURSIVE hierarchy (folderid, ParentFolderId, FolderName) as (
SELECT folderid, ParentFolderId, FolderName
FROM folders
WHERE folderid = :folderid
UNION ALL
SELECT folderid, ParentFolderId, FolderName
FROM folders f
JOIN hierarchy p ON p.parentFolderID = f.folderID
)
SELECT List(FolerName, ' \ ') FROM hierarchy
结果如下:
Child \ Parent \ Parent的父级
如何将上述查询的结果反转为:
父母的父母\父母\儿童?
谢谢!
答案 0 :(得分:1)
LIST
返回的值的顺序未定义。
您可以尝试将查询包装到子选择中:
WITH RECURSIVE
hierarchy (folderid, ParentFolderId, FolderName, rn) AS
(
SELECT folderid, ParentFolderId, FolderName, 1
FROM folders
WHERE folderid = :folderid
UNION ALL
SELECT folderid, ParentFolderId, FolderName, p.rn + 1
FROM folders f
JOIN hierarchy p
ON p.parentFolderID = f.folderID
)
SELECT LIST(FolderName, ' \ ')
FROM (
SELECT *
FROM hierarchy
ORDER BY
rn DESC
)
但是,这并不保证能够正常工作,即使它偶然发生,也可能会破坏任何新版本。
答案 1 :(得分:0)
在hierarcy的第一个select语句中添加一个计算的int字段,然后递增它。这样,层次结果将有增量归档反向排序。
注意,我不是Firebird的人,所以这只是一个提案。