sql >> Databáze >  >> RDS >> PostgreSQL

Převést rekurzivní funkci na zobrazení

Jednodušší funkce

V první řadě můžete zjednodušit vaše funkce docela dost. Tato jednodušší funkce SQL dělá totéž:

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;

Volejte:

select * from f_tree(15);
  • Mohli byste použijte plpgsql, může být mírně užitečné pro zpeněžování plánu dotazů ve verzích před PostgreSQL 9.2. Ale vy jste zrušili jedinou teoretickou výhodu použitím dynamického SQL bez potřeby. To nedává vůbec smysl. Zjednodušte na prostý SQL.

  • Použijte UNION ALL místo UNION , levnější, protože nemohou být podvody podle návrhu.

Jen SQL

Samozřejmě to můžete nahradit obyčejným 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;

Dělá to samé.

ZOBRAZIT

Nyní VIEW je triviální záležitost:

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;

Výsledek mi moc nedává smysl, ale otázka nedefinuje nic rozumnějšího..



  1. PHP, ORM, MSSQL a Unicode, je možné, aby to fungovalo dohromady?

  2. Přehled nového DBaaS od MariaDB - SkySQL

  3. Detekce změn sloupců ve spouštěči aktualizace postgres

  4. MySQL spojí dvě tabulky s maximální hodnotou na jiném poli