PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Ubah fungsi rekursif menjadi tampilan

Fungsi yang lebih sederhana

Pertama-tama, Anda dapat menyederhanakan fungsi Anda cukup sedikit. Fungsi SQL yang lebih sederhana ini melakukan hal yang sama:

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;

Telepon:

select * from f_tree(15);
  • Anda bisa gunakan plpgsql, mungkin sedikit bermanfaat untuk menguangkan paket kueri dalam versi sebelum PostgreSQL 9.2. Tetapi Anda membatalkan satu-satunya manfaat teoretis dengan menggunakan SQL dinamis tanpa perlu. Ini tidak masuk akal sama sekali. Sederhanakan ke SQL biasa.

  • Gunakan UNION ALL bukannya UNION , lebih murah karena desainnya tidak boleh ditipu.

Hanya SQL

Jelas, Anda dapat mengganti ini dengan SQL biasa:

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;

Melakukan hal yang sama.

LIHAT

Sekarang, VIEW adalah masalah sepele:

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;

Hasilnya tidak masuk akal bagi saya, tetapi pertanyaannya tidak mendefinisikan sesuatu yang lebih masuk akal ..



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apakah ada cara untuk membuat pg_dump mengecualikan urutan tertentu?

  2. Kueri UNION ALL dinamis di Postgres

  3. Dapatkan nilai Kolom dari baris sebelumnya di postgres tidak dapat menggunakan fungsi jendela di UPDATE

  4. buat kolom untuk tanggal otomatis di postgresql

  5. Bagaimana cara melakukan kueri PostgreSQL dengan klausa where-in yang berisi banyak kolom secara terprogram?