PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Permintaan SQL PostgreSQL untuk melintasi seluruh grafik yang tidak diarahkan dan mengembalikan semua tepi yang ditemukan

Saya mendapatkan ini, seharusnya tidak masuk ke loop tak terbatas dengan jenis data apa pun:

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

Kueri rekursif sangat membatasi dalam hal apa yang dapat dipilih, dan karena mereka tidak mengizinkan penggunaan hasil rekursif di dalam subpilihan, seseorang tidak dapat menggunakan NOT IN (pilih * dari rekursif di mana ...). Menyimpan hasil dalam array, menggunakan LEFT JOIN LATERAL dan menggunakan =ANY() dan <>ALL() memecahkan teka-teki ini.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. GroupingError:ERROR:kolom harus muncul di klausa GROUP BY atau digunakan dalam fungsi agregat

  2. Apakah ada cara aman untuk memodifikasi tabel pg_constraint agar tidak ada lagi pemeriksaan yang dilakukan ( sementara )?

  3. Bagaimana cara mengelompokkan cap waktu ke dalam pulau (berdasarkan celah sewenang-wenang)?

  4. sqlalchemy tidak mengeksekusi Komentar pada skema

  5. pg gem sslmode=verify-full, di mana menempatkan sertifikat?