sql >> データベース >  >> RDS >> PostgreSQL

再帰関数をビューに変換する

    よりシンプルな機能

    まず、簡素化できます あなたの機能はかなりです。この単純なSQL関数は同じことをします:

    CREATE OR REPLACE FUNCTION f_tree(_rev int)
     RETURNS TABLE(id int, parent_id int, depth int) AS
    $func$
       WITH RECURSIVE tree_list AS (
          SELECT t.id, t.parent_id, 1 -- AS depth
          FROM   tree t
          WHERE  t.id = $1
    
          UNION ALL  -- no point using UNION
          SELECT t.id, t.parent_id, r.depth + 1
          FROM   tree_list r
          JOIN   tree t ON t.id = r.parent_id
          )
       SELECT t.id, t.parent_id, t.depth
       FROM   tree_list t
       ORDER  BY t.id;
    $func$ LANGUAGE sql;
    

    電話:

    select * from f_tree(15);
    
    • あなたはできた plpgsqlを使用します。少しかもしれません PostgreSQL9.2より前のバージョンでクエリプランをキャッシュするのに役立ちます。しかし、動的SQLを必要とせずに使用することで、理論上の唯一の利点を無効にしました。これはまったく意味がありません。単純化してプレーンSQLにします。

    • UNION ALLを使用する UNIONの代わりに 、設計上重複がないため、より安価です。

    SQLだけ

    もちろん、これをプレーンSQLに置き換えることができます:

    WITH RECURSIVE tree_list AS (
       SELECT t.id, t.parent_id, 1 AS depth
       FROM   tree t
       WHERE  t.id = 15  -- enter parameter here
    
       UNION ALL
       SELECT t.id, t.parent_id, r.depth + 1
       FROM   tree_list r
       JOIN   tree t ON t.id = r.parent_id
       )
    SELECT t.id, t.parent_id, t.depth
    FROM   tree_list t
    ORDER  BY t.id;
    

    同じことをします。

    表示

    さて、VIEW 些細なことです:

    CREATE OR REPLACE VIEW v_tree15 AS
    WITH RECURSIVE tree_list AS (
       SELECT t.id, t.parent_id, 1 AS depth
       FROM   tree t
       WHERE  t.id <= 15   -- only detail to change
    
       UNION ALL
       SELECT t.id, t.parent_id, r.depth + 1
       FROM   tree_list r
       JOIN   tree t ON t.id = r.parent_id
       )
    SELECT t.id, t.parent_id, t.depth
    FROM   tree_list t
    ORDER  BY t.id;
    

    結果は私にはあまり意味がありませんが、質問はより賢明なものを定義していません..



    1. 階層型MySQLクエリのヘルプが必要

    2. PHP-データベースからデータを取得し、それを変数と比較して、より少ない値で並べ替えます

    3. SQL Serverでグローバル変数を宣言する方法..?

    4. リフトとMySQLを接続する方法は?