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

Вземете пътищата от база данни с точки в sql

Използвайте рекурсивен cte с array[array[source, destination]] като колона за обобщаване:

with recursive cte(source, destination, path) as (
    select source, destination, array[array[source, destination]]
    from points
union all
    select p.source, p.destination, path || array[p.source, p.destination]
    from cte c
    join points p on c.destination = p.source
    where not array[array[p.source, p.destination]] <@ path
)
select distinct on (path[1:1]) path
from (
    select distinct on (source, destination) *
    from cte
    order by source, destination, array_length(path, 1) desc
    ) s    
order by path[1:1], array_length(path, 1) desc;

        path         
---------------------
 {{1,2},{2,3},{3,7}}
 {{5,7}}
 {{9,12}}
(3 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. Защо прагът на подготвения израз на PostgreSQL JDBC е по подразбиране 5?

  2. Подобряване на функция, която UPSERTs въз основа на входен масив

  3. Грешка в инструментите на Eclipse/Hibernate:Записът в класовата пътека на архива не съществува

  4. Присъединете се към две маси въз основа на близки времеви клейма

  5. Как да съединя само един ред в обединена таблица с postgres?