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

PostgreSQL SQL заявка за обхождане на цял неориентиран график и връщане на всички намерени ръбове

Стигнах до това, не трябва да влиза в безкрайни цикли с каквито и да било данни:

--create temp table edges ("from" text, "to" text);
--insert into edges values ('initial_node', 'a'), ('a', 'b'), ('a', 'c'), ('c', 'd');

with recursive graph(points) as (
  select array(select distinct "to" from edges where "from" = 'initial_node')
  union all
  select g.points || e1.p || e2.p
  from graph g
  left join lateral (
    select array(
      select distinct "to"
      from edges 
      where "from" =any(g.points) and "to" <>all(g.points) and "to" <> 'initial_node') AS p) e1 on (true)
  left join lateral (
    select array(
      select distinct "from"
      from edges 
      where "to" =any(g.points) and "from" <>all(g.points) and "from" <> 'initial_node') AS p) e2 on (true)
  where e1.p <> '{}' OR e2.p <> '{}'
  )
select distinct unnest(points)
from graph
order by 1

Рекурсивните заявки са много ограничаващи по отношение на това какво може да бъде избрано и тъй като те не позволяват използването на рекурсивните резултати вътре в подизбор, не може да се използва NOT IN (изберете * от рекурсивно където...). Съхраняването на резултатите в масив, използването на LEFT JOIN LATERAL и използването на =ANY() и <>ALL() реши тази главоблъсканица.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Копирайте NULL стойности, присъстващи в csv файла, в postgres

  2. Как да накарам моята база данни postgresql да използва съпоставяне без значение за главни букви?

  3. Имате нужда от бърз метод за преобразуване на голямо количество double в низ

  4. Пренасочване на вмъкване, базирано на задействане на Postgres, без прекъсване на RETURNING

  5. Как да разрешите ФАТАЛНО:ограничението за връзка е превишено за не-суперпотребители