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

Рекурсивна заявка за хирархични данни въз основа на списък на съседство

Вашата заявка за първо ниво (тук depth за разграничаване от таблицата) трябва да изглежда така:

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)

Обърнете внимание, че правилното използване на is null (не използвайте = за сравнение с null тъй като винаги дава null ).

Можете да използвате горното като начална заявка в рекурсивен cte:

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. postgres. plpgsql ограничението за дълбочина на стека е надвишено

  2. Как да конфигурирате PreparedStatement Caching с Postgres и Tomcat7 JDBC Pool?

  3. Свиване на няколко реда от масиви, ако масивите се припокриват

  4. django.db.migrations.RenameModel и име на последователност на AutoField

  5. Кой е най-бързият начин за възстановяване на статистиката на PostgreSQL от нула/нулата с ANALYZE?