Apakah ada cara untuk melintasi data pohon dalam SQL? Saya tahu tentang connect by
di Oracle, tetapi apakah ada cara lain untuk melakukan ini dalam implementasi SQL lainnya? Saya bertanya karena menggunakan connect by
lebih 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_id
bidang 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 by
itu 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.
sumber
Jawaban:
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".
sumber
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
HIERARCHYID
tipe data. Anda dapat menemukan contoh yang baik dari ini di HierarchyID: Model Hierarki Data Anda dengan SQL Server 2008Sumber daya tambahan:
sumber
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.
sumber
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
ltree
yang memberikan serangkaian kelebihan dan kekurangan dalam implementasi.Anda dapat menemukan informasi lebih lanjut di situs ini dengan mencari melalui tag hierarki .
sumber