2011-07-21 7 views
1

私はFirebird 2.1を使用しています。これらのフィールドで、表名のフォルダがあります:このクエリの結果を元に戻すにはどうすればよいですか?

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 

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

上記のクエリの結果を逆にするにはどうすればよいでしょうか:

親の親\ Parent \ Child?

ありがとうございます!

+0

どのデータベースをお使いですか?これは、Oracleでは単純です... – Randy

+0

最初の文とタグを参照してください。 Firebird 2.1 – Steve

+0

このページによると:http://www.firebirdsql.org/refdocs/langrefupd21-aggrfunc-list.html、リスト値の順序は 'LIST()'では未定義です。 –

答えて

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 
     ) 

、しかし、これは動作が保証されていないと、それは偶然でない場合でも、それはどんな新しいバージョンで破ることができます。

+0

こんにちは!なぜこれが動作することが保証されていないのですか?リストは、この場合、クエリがRow1 \ Row2 \ Row3のような順序で結果を返すことになっています。 – Steve

+1

@Steve: 'LIST'は特定の順序で結果を返すはずです。それがそういうことをしなければならないなら、それは文書でカバーされるだろう。テーブルを並行してクエリするマルチプロセッサバージョンをリリースして、あなたの想定した 'LIST'命令が突然壊れても、驚かないでください。 – Quassnoi

+0

これは悪いニュースです。しかし、そうでない場合は、自分自身で結果をリストにコンパイルすると(またはストアドプロシージャを使用すると)、上記のクエリは正常に動作するはずです。 – Steve

0

hierarcyの最初のselect文に計算されたintフィールドを追加し、それをインクリメントします。そうすれば、階層化の結果は、ソートを逆順にするために増分提出されます。

私はFirebirdの人ではないので、単なる提案です。

関連する問題