1

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

結果は次のようになります。

子\親\親の親

上記のクエリの結果を逆にして取得するにはどうすればよいですか。

親の親\親\子?

ありがとうございました!

4

2 に答える 2

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
        )

、ただし、これは動作することが保証されているわけではなく、偶然に動作した場合でも、新しいバージョンで壊れる可能性があります.

于 2011-07-21T12:51:46.837 に答える
0

階層内の最初の select ステートメントに計算された int フィールドを追加し、それをインクリメントします。そうすれば、階層の結果には、逆ソートするためのインクリメンタル フィールドが含まれます。

注意してください、私は Firebird 派ではないので、これは単なる提案です。

于 2011-07-21T12:43:05.440 に答える