Pertanyaan Rekursif dalam SQLite3: Menyelesaikan Perhubungan Data Hierarki Kompleks
SQLite3, enjin pangkalan data yang digunakan secara meluas, secara tradisinya tidak mempunyai sokongan untuk pertanyaan rekursif, menimbulkan cabaran apabila berurusan dengan struktur data hierarki. Walau bagaimanapun, dengan pengenalan Ungkapan Jadual Biasa (CTE) dalam SQLite 3.8.3, pengguna memperoleh keupayaan untuk melaksanakan pertanyaan rekursif.
Contoh Pertanyaan Rekursif
Pertimbangkan jadual bernama "Bahagian" dengan struktur berikut:
Table: Part Part SuperPart wk0Z wk00 wk06 wk02 wk07 wk02 eZ01 eZ00 eZ02 eZ00 eZ03 eZ01 eZ04 eZ01
Untuk mencari semua pasangan daripada "SuperPart" tertentu dengan sub-bahagiannya, pertanyaan rekursif diperlukan. Sebagai contoh, untuk "SuperPart" eZ00, pertanyaan harus mengembalikan pasangan seperti (eZ00, eZ01), (eZ01, eZ03) dan (eZ00, eZ03).
Menggunakan CTE Rekursif
Sejak SQLite 3.8.3, CTE rekursif boleh bekerja untuk pertanyaan sedemikian. Pertanyaan berikut memanfaatkan CTE untuk mencapai hasil yang diingini:
WITH RECURSIVE subParts AS ( SELECT Part, SuperPart FROM Part WHERE SuperPart = :superPart UNION ALL SELECT p.Part, p.SuperPart FROM Part AS p JOIN subParts AS sp ON p.SuperPart = sp.Part ) SELECT Part, SuperPart FROM subParts;
Pertanyaan ini menggunakan CTE bernama "subParts" untuk mencari secara berulang semua sub-bahagian "SuperPart" yang diberikan. Klausa "UNION ALL" rekursif membolehkan CTE bergabung sendiri, membenarkannya merentasi hierarki dan mengumpul pasangan yang diperlukan.
Menggunakan Rekursi Kod Pelanggan
Untuk versi SQLite sebelum 3.8.3, yang tidak mempunyai sokongan CTE, rekursi kod klien mesti digunakan. Ini melibatkan pengambilan semula baris dan ID subbahagian secara manual sehingga tiada lagi data dikembalikan. Coretan berikut menggambarkan pendekatan ini:
# Recursive helper function def get_subparts(superPart): # Get initial row and sub-part IDs row = select_one("SELECT Part, SuperPart FROM Part WHERE SuperPart = ?", (superPart,)) if not row: return # Yield current sub-part yield row['Part'] # Recursively get sub-parts of sub-parts for subPart in get_subparts(row['Part']): yield subPart # Iterate over sub-parts using client-code recursion for subPart in get_subparts("eZ00"): print(subPart)
Atas ialah kandungan terperinci Bagaimanakah Pertanyaan Rekursif dalam SQLite3 Menyelesaikan Perhubungan Data Hierarki Kompleks?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!