sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL SQL-query voor het doorlopen van een volledige ongerichte grafiek en het retourneren van alle gevonden randen

Ik heb dit bereikt, het mag niet in oneindige lussen komen met welke gegevens dan ook:

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

Recursieve query's zijn zeer beperkt in termen van wat kan worden geselecteerd, en aangezien ze het gebruik van recursieve resultaten binnen een subselect niet toestaan, kan men NOT IN (selecteer * from recursive where...) niet gebruiken. Het opslaan van resultaten in een array, met behulp van LEFT JOIN LATERAL en het gebruik van =ANY() en <>ALL() loste dit raadsel op.




  1. MySQL-foutcode:1005

  2. SQL CASE-instructie

  3. MySQL-query voor boekkosten van een klas

  4. Installatie van RODBC/ROracle-pakketten op OS X Mavericks