PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Convertir la fonction récursive en vue

Fonction simplifiée

Tout d'abord, vous pouvez simplifier votre fonction un peu. Cette fonction SQL plus simple fait la même chose :

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;

Appel :

select * from f_tree(15);
  • Vous pourriez utiliser plpgsql, peut-être légèrement bénéfique pour encaisser le plan de requête dans les versions antérieures à PostgreSQL 9.2. Mais vous avez annulé le seul avantage théorique en utilisant SQL dynamique sans besoin. Cela n'a aucun sens. Simplifiez en SQL brut.

  • Utilisez UNION ALL au lieu de UNION , moins cher car il ne peut pas y avoir de dupes par conception.

Juste SQL

Évidemment, vous pouvez remplacer ceci par du SQL simple :

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;

Fait la même chose.

VOIR

Maintenant, la VIEW est une question triviale :

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;

Le résultat n'a pas beaucoup de sens pour moi, mais la question ne définit rien de plus sensé ..