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

Kueri rekursif untuk data hierarkis berdasarkan daftar kedekatan

Permintaan Anda untuk tingkat pertama (di sini depth untuk membedakan dari tabel) akan terlihat seperti ini:

select l.name, h.child_id, 1 as depth 
from level l
join level_hierarchy h on l.id = h.child_id 
where h.parent_id is null;

   name   | child_id | depth 
----------+----------+-------
 Level1_a |        1 |     1
(1 row)

Perhatikan penggunaan yang tepat dari is null (jangan gunakan = untuk membandingkan dengan null karena selalu memberikan null ).

Anda dapat menggunakan di atas sebagai kueri awal dalam cte rekursif:

with recursive recursive_query as (
    select l.name, h.child_id, 1 as depth 
    from level l
    join level_hierarchy h on l.id = h.child_id 
    where h.parent_id is null
union all
    select l.name, h.child_id, depth + 1
    from level l
    join level_hierarchy h on l.id = h.child_id
    join recursive_query r on h.parent_id = r.child_id
)
select *
from recursive_query
-- where depth = 2

   name   | child_id | depth 
----------+----------+-------
 Level1_a |        1 |     1
 Level2_b |        3 |     2
 Level2_a |       19 |     2
 Level3_a |        4 |     3
 Level3_b |        5 |     3
 Level4_a |        6 |     4
 Level4_b |        7 |     4
(7 rows)    


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Buat indeks multikolom untuk menegakkan keunikan

  2. Kesalahan Heroku:ActionView::Template::Error (metode `captcha' tidak ditentukan untuk #<Message:0x007fc9df016930>)

  3. Bagaimana cara memberi label grup di postgresql ketika kepemilikan grup bergantung pada baris sebelumnya?

  4. Lihat dan hapus cache/buffer Postgres?

  5. array_agg untuk Tipe Array