首頁 > 資料庫 > mysql教程 > SQLite3中的遞迴查詢如何解決複雜的層次資料關係?

SQLite3中的遞迴查詢如何解決複雜的層次資料關係?

Susan Sarandon
發布: 2025-01-03 03:46:37
原創
158 人瀏覽過

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

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板