PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Konwertuj funkcję rekurencyjną na widok

Prostsza funkcja

Przede wszystkim możesz uprościć twoja funkcja całkiem sporo. Ta prostsza funkcja SQL robi to samo:

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;

Zadzwoń:

select * from f_tree(15);
  • możesz użyj plpgsql, może być nieco korzystne dla spieniężenia planu zapytań w wersjach przed PostgreSQL 9.2. Ale pozbyłeś się jedynej teoretycznej korzyści, używając dynamicznego SQL bez potrzeby. To w ogóle nie ma sensu. Uprość do zwykłego SQL.

  • Użyj UNION ALL zamiast UNION , tańsze, ponieważ z założenia nie może być duplikatów.

Tylko SQL

Oczywiście możesz to zastąpić zwykłym 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;

Robi to samo.

WIDOK

Teraz VIEW to banalna sprawa:

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;

Wynik nie ma dla mnie większego sensu, ale pytanie nie definiuje niczego sensowniejszego..



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak podzielić wartość na wiele wierszy w znaku nowej linii w PostgreSQL?

  2. SQL:Znajdź najdłuższy wspólny ciąg między wierszami

  3. baza danych zmiany nazwy postgres nie działa

  4. Docker — Jak uruchomić polecenie psql w kontenerze postgres?

  5. Dołączyć nazwę tabeli do każdej kolumny w zestawie wyników w SQL? (w szczególności Postgres)