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

Bidang gabungan CTE rekursif dengan orang tua dari titik sewenang-wenang

Di atas-bawah metode kueri awal harus memilih hanya akar (item tanpa orang tua), sehingga kueri mengembalikan setiap baris hanya sekali:

with recursive top_down as (
    select id, parent, text
    from test
    where parent is null
union all
    select t.id, t.parent, concat_ws('/', r.text, t.text)
    from test t
    join top_down r on t.parent = r.id
)
select id, text
from top_down
where id = 4    -- input

Jika tujuan Anda adalah menemukan item tertentu, bottom-up pendekatan lebih efisien:

with recursive bottom_up as (
    select id, parent, text
    from test
    where id = 4    -- input
union all
    select r.id, t.parent, concat_ws('/', t.text, r.text)
    from test t
    join bottom_up r on r.parent = t.id
)
select id, text
from bottom_up
where parent is null

Hapus kondisi final where di kedua kueri untuk melihat perbedaannya.

Uji di rextester.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 3 Cara Mendaftar semua Prosedur Tersimpan dalam Database PostgreSQL

  2. Bagaimana cara memasukkan catatan yang dapat diperbarui dengan kolom JSON di PostgreSQL menggunakan JOOQ?

  3. Mengakses file XML eksternal sebagai variabel dalam skrip PSQL (bersumber dari skrip bash)

  4. Menghubungkan ke database PostgreSQL melalui tunneling SSH dengan Python

  5. MASUKKAN KE ... DARI PILIH ... MENGEMBALIKAN pemetaan id