sql >> Database >  >> RDS >> PostgreSQL

Recursieve functie converteren naar weergave

Eenvoudigere functie

Allereerst kunt u vereenvoudigen je functie nogal. Deze eenvoudigere SQL-functie doet hetzelfde:

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;

Bel:

select * from f_tree(15);
  • Je zou gebruik plpgsql, misschien enigszins gunstig voor het verzilveren van het queryplan in versies vóór PostgreSQL 9.2. Maar je hebt het enige theoretische voordeel teniet gedaan door dynamische SQL zonder noodzaak te gebruiken. Dit heeft helemaal geen zin. Vereenvoudig naar gewone SQL.

  • Gebruik UNION ALL in plaats van UNION , goedkoper omdat er door het ontwerp geen dupes kunnen zijn.

Gewoon SQL

Uiteraard kunt u dit vervangen door gewone 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;

Doet hetzelfde.

WEERGAVE

Nu, de VIEW is een triviale zaak:

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;

Het resultaat lijkt me niet zo logisch, maar de vraag definieert niets zinnigers ..



  1. Php Mysql zoeken tussen twee datums

  2. Yii MySql-query laten uitvoeren

  3. Is het mogelijk om een ​​string in MySQL uit te voeren?

  4. Fouten bij het maken van de hoofdtekst van het Oracle-pakket