PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Truy vấn SQL PostgreSQL để duyệt qua toàn bộ đồ thị vô hướng và trả về tất cả các cạnh được tìm thấy

Tôi hiểu điều này, nó sẽ không đi vào vòng lặp vô hạn với bất kỳ loại dữ liệu nào:

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

Truy vấn đệ quy rất hạn chế về những gì có thể được chọn, và vì chúng không cho phép sử dụng kết quả đệ quy bên trong một lựa chọn con, người ta không thể sử dụng NOT IN (chọn * từ đệ quy ở đâu ...). Lưu trữ kết quả trong một mảng, sử dụng LEFT JOIN LATERAL và sử dụng =ANY () và <> ALL () đã giải quyết được vấn đề hóc búa này.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TypeORM không hỗ trợ cài đặt cơ sở dữ liệu trên trình trang trí thực thể

  2. Postgres đặt hàng theo hiệu suất khóa nước ngoài?

  3. Cách kiểm tra phiên bản PostgreSQL

  4. PostgreSQL ORDER BY các giá trị trong mệnh đề IN ()

  5. Rails Activerecord Relation:sử dụng truy vấn con làm bảng cho câu lệnh SQL select