sql >> Database teknologi >  >> RDS >> PostgreSQL

Konverter rekursiv funktion til visning

Enklere funktion

Først og fremmest kan du forenkle din funktion en del. Denne enklere SQL-funktion gør det samme:

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;

Ring til:

select * from f_tree(15);
  • Du kunne brug plpgsql, kan være lidt gavnlig til at indløse forespørgselsplanen i versioner før PostgreSQL 9.2. Men du annullerede den eneste teoretiske fordel ved at bruge dynamisk SQL uden behov. Dette giver overhovedet ingen mening. Forenkle til almindelig SQL.

  • Brug UNION ALL i stedet for UNION , billigere, da der ikke kan være duper af design.

Bare SQL

Selvfølgelig kan du erstatte dette med almindelig 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;

Gør det samme.

SE

Nu, VIEW er en triviel sag:

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;

Resultatet giver ikke megen mening for mig, men spørgsmålet definerer ikke noget mere fornuftigt ..



  1. Sådan bruger du mysqli vedvarende forbindelse på tværs af forskellige sider

  2. Postgres forbindelse pooling - flere brugere

  3. Alt du behøver at vide om SQL CTE på ét sted

  4. Kopier tabelstruktur til ny tabel