sql >> Databasteknik >  >> RDS >> PostgreSQL

Konvertera rekursiv funktion till visning

Enklare funktion

Först och främst kan du förenkla din funktion ganska mycket. Den här enklare SQL-funktionen gör samma sak:

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:

select * from f_tree(15);
  • Du kunde använd plpgsql, kan vara lite fördelaktigt för att lösa in frågeplanen i versioner före PostgreSQL 9.2. Men du ogiltigförklarade den enda teoretiska fördelen genom att använda dynamisk SQL utan behov. Detta är ingen mening alls. Förenkla till vanlig SQL.

  • Använd UNION ALL istället för UNION , billigare eftersom det inte kan finnas duper av design.

Bara SQL

Självklart kan du ersätta detta med vanlig 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 samma sak.

VISA

Nu, VIEW är en trivial sak:

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 är inte så vettigt för mig, men frågan definierar inte något vettigare ..



  1. Beräkna skillnaden mellan min och max för varje kolumn endast om den är högre än 0

  2. Wildfly 10 kan inte ladda MySQL XA-drivrutinen vid start

  3. ClusterControl - Advanced Backup Management - PostgreSQL

  4. Postgres:filtrering av resultat med ARRAY_AGG och HAVING (istället för WHERE)