sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL SQL-forespørgsel til at krydse en hel urettet graf og returnere alle fundne kanter

Jeg kom til dette, det burde ikke komme ind i uendelige løkker med nogen form for data:

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

Rekursive forespørgsler er meget begrænsende med hensyn til, hvad der kan vælges, og da de ikke tillader brug af de rekursive resultater inde i et undervalg, kan man ikke bruge NOT IN (vælg * fra rekursiv hvor...). Lagring af resultater i et array, brug af LEFT JOIN LATERAL og brug af =ANY() og <>ALL() løste denne gåde.




  1. SQL Server Parallel Backup Restore -2

  2. Hvordan kan jeg indstille standardværdien for en tidsstempelkolonne til det aktuelle tidsstempel med Laravel-migreringer?

  3. Hvilken slags relation kræver disse 2 tabeller?

  4. kan vi indsætte i to tabeller med en enkelt sql-sætning?