sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL SQL dotaz pro procházení celého neorientovaného grafu a vrácení všech nalezených hran

Dostal jsem se k tomu, že by se to nemělo dostat do nekonečných smyček s jakýmkoli druhem dat:

--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

Rekurzivní dotazy jsou velmi omezující, pokud jde o to, co lze vybrat, a protože neumožňují použití rekurzivních výsledků uvnitř dílčího výběru, nelze použít NOT IN (vyberte * z rekurzivního kde...). Ukládání výsledků do pole pomocí LEFT JOIN LATERAL a pomocí =ANY() a <>ALL() tento hlavolam vyřešilo.




  1. Výstup všech chyb PHP do databáze není error_log

  2. ASP.NET MVC 4 EF5 s MySQL

  3. Jak se připojit k databázi pomocí Sequel Pro

  4. PHP/MySQL časové razítko a časová pásma