PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Преобразувайте рекурсивна функция в изглед

По-проста функция

Преди всичко можете да опростите вашата функция доста. Тази по-проста SQL функция прави същото:

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;

Обаждане:

select * from f_tree(15);
  • Вие можете използвайте plpgsql, може да е леко полезно за осребряване на плана за заявка във версии преди PostgreSQL 9.2. Но вие анулирахте единствената теоретична полза, като използвате динамичен SQL без нужда. Това изобщо няма смисъл. Опростете до обикновен SQL.

  • Използвайте UNION ALL вместо UNION , по-евтино, тъй като не може да има измамници по дизайн.

Само SQL

Очевидно можете да замените това с обикновен 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;

Прави същото.

ПРЕГЛЕД

Сега, VIEW е тривиален въпрос:

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;

Резултатът няма много смисъл за мен, но въпросът не определя нищо по-разумно ..



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. С нетърпение очакваме PGConf India 2017

  2. PostgreSQL/performance един общ курсор или създаване за всяка заявка

  3. PostgreSQL - условно подреждане

  4. Добавете колона за автоматично нарастване към съществуваща таблица, подредена по дата

  5. Извикването на съхранена функция или процедура няма да вмъкне и да запази промените