SQLite3 中的遞歸查詢:解決複雜的分層資料關係
SQLite3 作為一種廣泛使用的資料庫引擎,傳統上缺乏對遞歸查詢的支持,在處理分層資料結構時提出了挑戰。然而,隨著在 SQLite 3.8.3 中引入通用表表達式 (CTE),使用者獲得了執行遞歸查詢的能力。
遞歸查詢範例
考慮名為「Part」的表,其結構如下:
Table: Part Part SuperPart wk0Z wk00 wk06 wk02 wk07 wk02 eZ01 eZ00 eZ02 eZ00 eZ03 eZ01 eZ04 eZ01
找出所有對給定的「 SuperPart”及其子部分,需要遞迴查詢。例如,對於「SuperPart」eZ00,查詢應傳回 (eZ00, eZ01)、(eZ01, eZ03) 和 (eZ00, eZ03) 等對。
使用遞歸 CTE
從 SQLite 3.8.3 開始,遞歸 CTE 可以用於此類查詢。以下查詢利用 CTE 來實現所需的結果:
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;
此查詢使用名為“subParts”的 CTE 迭代查找給定“SuperPart”的所有子部分。遞歸“UNION ALL”子句使 CTE 能夠自連接,從而允許它遍歷層次結構並收集所需的對。
使用客戶端程式碼遞歸
對於 3.8.3 之前的 SQLite 版本,缺少 CTE 支持,必須使用客戶端程式碼遞歸。這涉及手動檢索行和子部分 ID,直到不再傳回任何資料。以下程式碼片段說明了這種方法:
# 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)
以上是SQLite3中的遞迴查詢如何解決複雜的層次資料關係?的詳細內容。更多資訊請關注PHP中文網其他相關文章!