Rumah > pangkalan data > tutorial mysql > Bagaimanakah Pertanyaan Rekursif dalam SQLite3 Menyelesaikan Perhubungan Data Hierarki Kompleks?

Bagaimanakah Pertanyaan Rekursif dalam SQLite3 Menyelesaikan Perhubungan Data Hierarki Kompleks?

Susan Sarandon
Lepaskan: 2025-01-03 03:46:37
asal
165 orang telah melayarinya

How Can Recursive Queries in SQLite3 Solve Complex Hierarchical Data Relationships?

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
Salin selepas log masuk

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;
Salin selepas log masuk

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)
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan