Melintasi data seperti pohon dalam basis data relasional menggunakan SQL

16

Apakah ada cara untuk melintasi data pohon dalam SQL? Saya tahu tentang connect bydi Oracle, tetapi apakah ada cara lain untuk melakukan ini dalam implementasi SQL lainnya? Saya bertanya karena menggunakan connect bylebih mudah daripada menulis loop atau fungsi rekursif untuk menjalankan kueri untuk setiap hasil.

Karena beberapa orang tampaknya bingung dengan frasa "data pohon" Saya akan menjelaskan lebih lanjut: Yang saya maksud adalah mengenai tabel yang memiliki parent_idbidang atau yang serupa yang berisi kunci utama dari baris lain di tabel yang sama.

Pertanyaannya berasal dari pengalaman di mana saya bekerja dengan data yang disimpan dengan cara ini di database Oracle dan tahu bahwa connect byitu tidak diimplementasikan dalam DBMS lainnya. Jika seseorang menggunakan SQL standar, orang harus membuat alias tabel baru untuk setiap orang tua yang ingin dinaikkan. Ini bisa dengan mudah lepas kendali.

indyK1ng
sumber
Anda memiliki solusi Joe Celko. Beberapa sampel: Pohon dalam SQL , Pohon dan Hirarki di Oracle , model kumpulan bersarang . Tidak perlu memiliki gula sintaks ;-).
Marian

Jawaban:

14

Buku Celko adalah sumber yang bagus - terkadang terlalu "akademis".

Saya juga benar-benar menemukan metode ini , yang dikenal sebagai 'tabel penutupan' untuk bekerja dengan cukup baik.

Jika Anda menggunakan database yang memungkinkan CTE rekursif (seperti PostgreSQL 8.4 atau lebih baru , atau SQL Server 2005 atau yang lebih baru ), mereka benar-benar cara terbaik untuk melakukannya. Jika Anda menggunakan Oracle, selalu ada "koneksi oleh" yang dimuliakan .

Ini adalah pengalaman saya bahwa jauh lebih umum untuk menyerahkan seperangkat tabel dalam skema "pohon naif", dan harus mencari cara untuk mengekstrak pohon yang benar dari penyimpanan itu, daripada memiliki kesempatan untuk membuat pembersih struktur "tabel penutupan".

TML
sumber
9

CTE rekursif akan menjadi solusi termudah Anda. SQL Server 2005 dan versi terbaru PostgreSQL mendukung CTE. Jika Anda menggunakan SQL Server 2008 atau yang lebih baru, Anda bisa menggunakan HIERARCHYIDtipe data. Anda dapat menemukan contoh yang baik dari ini di HierarchyID: Model Hierarki Data Anda dengan SQL Server 2008

Sumber daya tambahan:

Jeremiah Peschka
sumber
5

Dalam SQL Server (edisi 2005 dan yang lebih baru) Anda bisa menggunakan Common Table Expressions untuk membaca hierarki, lihat Microsoft SQL Server 2005 - Contoh CTE hierarki sederhana untuk beberapa contoh.

Saya telah merekomendasikan buku tentang hal ini secara lebih umum yaitu "Pohon dan Hirarki dalam SQL untuk Smarties" oleh Joe Celko - meskipun saya belum benar-benar melihat buku itu sendiri.

David Spillett
sumber
1

Metode SQL standar adalah "Permintaan Rekursif" yang disediakan oleh CTE Rekursif dan ditetapkan sebagai WITH [ RECURSIVE ]dalam permintaan. Implementasi tidak ditentukan dalam spesifikasi, hanya metode yang tersedia untuk permintaan struktur yang bersifat rekursif. Dalam kasus yang paling sederhana, implementasi struktur data hanya memerlukan ID dan Parent ID pada satu baris.

Ada juga banyak solusi khusus RDBMS: misalnya, PostgreSQL mendukung CTE Rekursif, tetapi juga menyediakan ltreeyang memberikan serangkaian kelebihan dan kekurangan dalam implementasi.

Anda dapat menemukan informasi lebih lanjut di situs ini dengan mencari melalui tag .

Evan Carroll
sumber