web-dev-qa-db-ja.com

RECURSIVE VIEWSでのユーティリティは限られていますか?

WITHを使用した再帰クエリ のドキュメントで、これを見つけることができます

再帰クエリは通常、階層データまたはツリー構造のデータを処理するために使用されます。

これは本当のようですが、これは RECURSIVE VIEW sでどのように機能しますか?再帰ビューでは、ビューの呼び出し元からエッジケースを定義することはできません。プランナーがそのエッジケースを押し下げる機会もありません。

たとえば、このクエリを取ります

WITH RECURSIVE t(name, groupid, parentid) AS(         
  SELECT name,groupid,parentid                        
    FROM rl.groups                                    
    WHERE groupid = 2 -- this defines the Edge case
  UNION                                               
  SELECT groups.name, groups.groupid, groups.parentid 
    FROM rl.groups AS groups, t                       
    WHERE groups.groupid = t.parentid                 
)                                                     
SELECT * FROM t;

これにより、グループ2、およびそのグループのすべての親とその親が表示されます。しかし、どうすればそれを便利なRECURSIVE VIEWにすることができますか?私が知る限り、あなたはできません。そして、それは階層的でツリー構造のデータのユースケースを排除します。その時、彼らは何のために良いのでしょうか?再帰的な数学的シーケンスを構築するだけですか?

3
Evan Carroll

再帰ビューは、再帰CTEの単なる構文糖衣です。

create or replace recursive view foo (name, groupid, parentid) as 
  select name, groupid,parentid from rl.groups where groupid=2
  union
  SELECT groups.name, groups.groupid, groups.parentid 
    FROM rl.groups AS groups, foo                       
    WHERE groups.groupid = foo.parentid ;

あなたのCTEと同じです。

CTEをパラメーター化する場合は、それを関数でラップします。

3
Neil McGuigan